call和apply和bind区别
var obj = {name: 'lemon'};
function fn(num1, num2){
console.log(num1, num2);
console.log(this);
}
fn.call(100, 200)
-> NaN
-> 100
我想让fn中的this变为obj, 执行fn时传入参数为100, 200
apply和call
Function.prototype.call(thisArg, arg1, arg2, ...)
Function.prototype..apply(thisArg, [argsArray])
相同:
- apply和call方法的作用是一模一样的, 都是用来改变方法的this关键字并且把方法执行, 而且在严格模式下和非严格模式下对于第一个参数是null/undefined这种情况的规律也是一样的
不相同:
- call再给fn传递参数的时候, 是一个一个的传递值的
- apply不是一个一个传, 而是把要给fn传递的参数值统一的放在一个数组中进行操作, 但是也相当于一个个的给fn的形参赋值
bind
Function.prototype.bind( thisArg[, arg1[, arg2[, ...]]] s )
bind: 这个方法在IE6-8下不兼容
- 只是改变了fn中的this为obj, 并且给fn传递了参数, 但是此时没有把fn这个函数执行, 执行bind会有一个返回值, 这个返回值是把fn的this改变后的结果.
- 它体现了一种预处理机制
- 这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。
使用call
fn.call(obj, 100, 200)
使用apply
fn.apply(obj, [100, 200])
bind
fn.bind(obj, 100, 200)(100, 200)
fn.bind(obj, 100)(200, 300)
严格模式编写
告诉浏览器接下来的JS代码按照严格模式进行编写:
"use strict"
我们发现严格模式下的this相对于非严格模式下的this主要区别在于:
- 对于JS代码中没有写执行主体的情况下, 非严格模式下默认都是window执行, 所以this指向的是window
- 但是在严格的模式下, 没有写就是没有执行主体, this指向的是undefined