this / bind / call /apply

最后更新于:2022-04-02 03:24:14

[TOC] ## this - 在 ES6 中可能会极大避免 this 产生的错误 - **this 永远指向最后调用它的那个对象** 示例1: ``` var name = "windowsName"; function a() { var name = "Cherry"; console.log(this.name); // windowsName console.log("inner:" + this); // inner: Window } a(); console.log("outer:" + this) // outer: Window ``` 我们看最后调用`a`的地方`a();`,前面没有调用的对象那么就是全局对象 window,这就相当于是`window.a()` 示例2: ``` var name = "windowsName"; var a = { name: "Cherry", fn : function () { console.log(this.name); // Cherry } } window.a.fn(); // or //a.fn(); ``` 示例2 ``` var name = "windowsName"; var a = { name : null, // name: "Cherry", fn : function () { console.log(this.name); // windowsName } } var f = a.fn; f(); // ``` this 的指向并不是在创建的时候就可以确定的,在 es5 中,永远是**this 永远指向最后调用它的那个对象** ### 怎么改变 this 的指向 * 使用 ES6 的箭头函数 * 在函数内部使用`_this = this` * 使用`apply`、`call`、`bind` * new 实例化一个对象 #### 箭头函数 ``` var name = "windowsName"; var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { setTimeout( () => { this.func1() },100); } }; a.func2() // Cherry ``` **箭头函数的 this 始终指向函数定义时的 this,而非执行时** 如果箭头函数被非箭头函数包含,则 this 绑定的是最近一层非箭头函数的 this,否则,this 为 undefined” #### 在函数内部使用 _this = this ``` var name = "windowsName"; var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { var _this = this; setTimeout( function() { _this.func1() },100); } }; a.func2() // Cherry ``` ## apply apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入 格式:`fun.apply(thisArg, [argsArray])` 示例1 ``` var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { setTimeout( function () { this.func1() }.apply(a),100); } }; a.func2() // Cherry ``` 示例2 ``` var a ={ name : "Cherry", fn : function (a,b) { console.log(this.name); console.log( a + b) } } a.fn.apply(a,[1,2]) // Cherry // 3 ``` ## call `fun.call(thisArg[, arg1[, arg2[, ...]]])` 示例1 ``` var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { setTimeout( function () { this.func1() }.call(a),100); } }; a.func2() // Cherry ``` 示例2 ``` var a ={ name : "Cherry", fn : function (a,b) { console.log(this.name); console.log( a + b) } } a.fn.call(a,1,2) // 3 ``` ## bind ``` var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { setTimeout( function () { this.func1() }.bind(a)(),100); } }; a.func2() // Cherry ``` bind()方法创建一个新的函数 ``` var a ={ name : "Cherry", fn : function (a,b) { console.log(this.name); console.log( a + b) } } a.fn.bind(a,1,2)() // Cherry // 3 ```
';