var color = 'red';
var o ={color:'blue'};
function sayColor() {
console.log(this.color)
}
function fN() {
var color = 'pink';
console.log(this.color)
}
console.log(window.color); // "red"
sayColor(); // "red" (此处,sayColor是在全局作用域下调用的。sayColor()与window.sayColor()是一样的。)
fN(); // "red" (看你有没有正真理解第二点😂)
引入.apply()和.call()的情况
引入.apply()和.call()可以扩充函数赖以运行的作用域。
var color = 'red';
var o ={color:'blue'};
function sayColor() {
console.log(this.color)
}
sayColor.call(this); // "red"
sayColor.call(window); // "red"
sayColor.call(null); // "red" (此时sayColor的this指向window)
sayColor.call(o); // "blue" (此时sayColor的this指向对象o)
sayColor.apply(this); // "red"
sayColor.apply(window); // "red"
sayColor.apply(null); // "red" (此时sayColor的this指向window)
sayColor.apply(o); // "blue"
o.sayColor(); // TypeError: o.sayColor is not a function
引入.bind()的情况
var color = 'red';
var o ={color:'blue'};
function sayColor() {
console.log(this.color)
}
sayColor.bind(o); // 函数调用.bind()方法只是创建一个该函数的实例,并不会立即执行
sayColor.bind(o)(); // "blue" (此时,sayColor函数的this指向对象o)
var objectSayColor = sayColor.bind(o);
objectSayColor(); // "blue" (此时,sayColor函数的this指向对象o)
this
的定义要正确了解
this
,还得先从其定义入手:this
是函数内部的两个特殊对象之一(另一个为arguments
);this
引用的是其所属函数被执行时的环境对象(说白了就是this所属函数的父级对象)this
也是不确定的,可能会在代码执行过程中引用不同的对象。案列分析
下面再来分析一下,当函数在不同作用域下被调用时,其
this
对象所引用的对象。一般情况
引入
.apply()
和.call()
的情况引入
.apply()
和.call()
可以扩充函数赖以运行的作用域。引入
.bind()
的情况bind与apply和call的区别
.apply()
和.call()
都是改变该方法所属函数
中的this
,并立即执行这个函数;.bind()
可以改变该方法所属函数
中的this
,不过它只是创建一个该函数的实例,并不会立即执行,也因此你可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加。鉴于以上区别,我们可以根据实际情况来选择使用。