为函数运行时的使用的 this 值,但使用的 this 值并不一定是该函数执行时的真正的 this 值。
在非严格模式下,null 和 undefined 会自动替换成全局对象(浏览器里就是 window ),同时值为原始值(数字、字符串、布尔值)的 this 指向该原始值的包装对象。
apply 和 call 的用法
1.改变 this 指向
var obj = {
name: 'Curry'
}
function func() {
console.log(this.name);
}
func.call(obj); // Curry
或去调用别的对象的方法:
var Person1 = function () {
this.name = 'Curry';
}
var Person2 = function () {
this.getname = function () {
console.log(this.name);
}
Person1.call(this);
}
var person = new Person2();
person.getname(); // Curry
2. 直接执行
function func() {
console.log('Curry');
}
func.call(); // Curry
function func(a, b, c) {
console.log(a, b, c);
}
var func1 = func.bind(null,'linxin');
func('A', 'B', 'C'); // A B C
func1('A', 'B', 'C'); // linxin A B
func1('B', 'C'); // linxin B C
func.call(null, 'linxin'); // linxin undefined undefined
ECMAScript
规范给所有函数都定义了call
与apply
两个方法,他们可应用的地方也很多,call
与apply
作用很相似,唯一的不同点就在于 传参的形式 不一样。不同点
先说语法:
apply
:func.apply(thisArg[, argsArray])
call
:func.apply(thisArg, arg1, arg2, ...)
apply
接受可包含多个参数的 数组 (或array-like
对象),而call
接受的是可包含若干个参数的 参数列表。共同点
apply
( 同call
)调用一个函数,第一个参数指定this
值。thisArg
:this
值,但使用的this
值并不一定是该函数执行时的真正的this
值。null
和undefined
会自动替换成全局对象(浏览器里就是window
),同时值为原始值(数字、字符串、布尔值)的this
指向该原始值的包装对象。apply 和 call 的用法
1.改变
this
指向或去调用别的对象的方法:
2. 直接执行
call
和apply
因为都会立即执行,所以也可以不传递参数,直接调用,只是一般很少人这样用,直接func()
多方便。call
和bind
的区别bind
是 ES5 新增加的一个方法,bind()
方法用于创建一个新的函数(叫做绑定函数),并在调用时,指定this
值,bind()
也接受预设的参数提供给原函数。所以它不会向call
一样直接执行。bind
用法bind()
方法可以使一个函数一开始就拥有一些预设参数,它们的位置从参数的第二项开始,之后这些预设参数会插入到目标函数参数列表的前面,目标函数原有的参数会放在后面:call
把从第二项开始的参数当做实参传递给目标函数,bind
方法把预设参数传递给目标函数,并且预设参数在目标新参数列表的开始位置。参考