如下是关于“javascript函数的4种调用方式与this的指向”的完整攻略:
1. 函数调用
在javascript中,最基本的函数调用方式就是函数调用。当一个函数作为普通函数调用时,函数内的this指向全局对象window。例如:
function sayHello() {
console.log("Hello " + this.name);
}
// 全局对象
var name = "Jack";
// 函数调用
sayHello(); // Hello Jack
虽然sayHello函数内并没有定义name变量,但是我们在全局作用域中定义了name变量,并且this指向全局对象,因此可以正常输出Hello Jack。
2. 对象方法调用
当函数作为对象的方法调用时,函数内的this指向该对象。例如:
var person = {
name: "Mike",
sayHello: function () {
console.log("Hello " + this.name);
}
}
// 对象方法调用
person.sayHello(); // Hello Mike
person.sayHello()的调用方式中,sayHello函数内的this指向person对象,因此输出Hello Mike。
3. 构造函数调用
当一个函数被new关键字所调用时,它就成为一个构造函数。在构造函数内部,this指向新创建的对象。例如:
function Person(name) {
this.name = name;
this.sayHello = function () {
console.log("Hello " + this.name);
}
}
// 构造函数调用
var person1 = new Person("Mike");
person1.sayHello(); // Hello Mike
在上述代码中,我们通过new运算符创建了一个新的person1对象,并且传入了名字参数“Mike”。在Person构造函数内部,定义了name属性和sayHello方法,而在这个实例化过程中,this指向新创建的person1对象。
4. apply/call调用
在javascript中,apply和call可以动态地改变函数内部的this指向。例如:
function sayHello() {
console.log("Hello " + this.name);
}
var person1 = {
name: "Mike"
}
var person2 = {
name: "Jack"
}
// apply/call调用
sayHello.call(person1); // Hello Mike
sayHello.apply(person2); // Hello Jack
在这个例子中,我们定义了一个sayHello全局函数。然后,我们定义了两个对象person1和person2,每个对象都有一个name属性。当我们用call方法将person1作为this参数传递给sayHello函数时,this指向person1对象,输出Hello Mike。同样的,当我们用apply方法将person2作为this参数传递给sayHello函数时,this指向person2对象,输出Hello Jack。
以上就是javascript函数的4种调用方式与this的指向的详细攻略,希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript函数的4种调用方式与this的指向 - Python技术站