JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型 |
您所在的位置:网站首页 › 创建对象时 › JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型 |
是否在 new 中调用(new 调用), this 指向新创建的对象 function Foo() { // do something } let f = new Foo(); 是否通过 call, apply(显示绑定), this 指向绑定的对象 // call() function foo() { console.log(this.a); } var obj = { a: 2, }; foo.call(obj); // 2 // apply() function foo(something) { console.log(this.a, something); return this.a + something; } var obj = { a: 2, }; var bar = function () { return foo.apply(obj, arguments); }; var b = bar(3); // 2 3 console.log(b); // 5 // bind() function foo(something) { this.a = something; } var obj1 = {}; var bar = foo.bind(obj1); bar(2); console.log(obj1.a); // 2 var baz = new bar(3); console.log(obj1.a); // 2 console.log(baz.a); // 3 是否在某个对象中调用(隐式绑定), this 指向绑定对象的上下文 // eg1: function foo() { console.log(this.a); // 2 } var obj = { a: 2, foo: foo, }; obj.foo(); // eg2: function foo() { console.log(this.a); } var obj2 = { a: 42, foo: foo, }; var obj1 = { a: 2, obj2: obj2, }; obj1.obj2.foo(); // 42 如果都不是,则是默认绑定,在严格模式下,this 指向 undefined。非严格模式下, this 指向全局对象。 function foo() { console.log(this.a); } var a = 2; foo(); // 2 // 严格模式下的位置 function foo() { 'use strict'; console.log(this.a); } var a = 2; foo(); // Type: this is undefined function foo() { console.log(this.a); } var a = 2; (function () { 'use strict'; foo(); // 2 });箭头函数不会使用上述四条规则,而是根据当前的词法作用域来决定 this 的,箭头函数会继承外层函数的 this。 注意:对于默认绑定来说,决定 this 绑定对象的并不是调用位置是否处于严格模式,而是函数体是否处于严格模式。如果函数体处于严格模式,this 会被绑定到 undefined, 否则 this 会绑定到全局对象。 优先级问题 显式绑定:call()、apply()。(硬绑定也是显式绑定的其中一种: bind())new 绑定: new Foo()隐式绑定: obj.foo();默认绑定: foo(); |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |