多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### ★ - 如何正确判断this? 箭头函数的this又是什么? **(绑定方式)**影响this的指向实际有4种: - 默认绑定:全局调用 - 隐式调用:对象调用 - 显示调用:call()、apply()、bind() - new绑定 * **默认** ~~~ function foo(){ console.log(this.a) } var a = 2 foo() // 2 → this指向全局 ~~~ * **隐式** ~~~ function foo(){ console.log(this.a) } var obj1 = { a = 1, foo } obj1.foo() // 1 → this 指向 obj1 ~~~ * **显式** ~~~ function foo(){ console.log(this.a) bar.apply( {a:2},arguments ) } function bar(b){ console.log(this.a + b) } var a = 1 // 全局 a 变量 foo(3) // 1 5 → 1 说明第一个打印种 this 指向全局,5 说明第二个打印中 this 指向 {a:2} ~~~ **❗ 小知识:call()、apply()、bind()三者区别** ``` call()、apply()属于立即执行函数,区别在于接收的参数形式不同,前者是依次传入参数,后者参数可以是数组 bind()则是创建一个新的包装函数,并且返回,它不会立即执行bind(this,arg1,arg2···) ``` **灵魂拷问:new 的实现原理** ~~~ 1 - 创建一个新对象 2 - 这个新对象会被执行[[原型]]链接 3 - 属性和方法被加入到this引用的对象里,并执行构造函数中的方法 4 - 如果函数没有返回其他对象,那么this指向这个新对象,否则this指向构造函数返回的对象 ~~~ ```javascript function myNew() { var constr = Array.prototype.shift.call(arguments); var obj = Object.create(constr.prototype); var result = constr.apply(obj, arguments); return result instanceof Object? result : obj; } ``` ==Object.create 和new区别== new关键字创建的对象会保留原构造函数的属性,而用Object.create()创建的对象不会。 **❗ 小知识:** ~~~ 对于this的绑定问题,优先级如下 New > 显式绑定 > 隐式绑定 > 默认绑定 ~~~ ### \- 如果对一个函数进行多次bind,会出现什么情况? 不管我们给函数进行几次bind显式绑定,函数中的this永远由 **第一次bind** 决定 ~~~ let a = {} let fn = function(){ console.log(this) } fn.bind().bind(a)() // => Window ~~~