var obj = { show: function () { console.log('this:', this); } }; var newobj = new obj.show(); // newobj
new > bind > 调用
1 2 3 4 5 6 7 8
var obj = { show: function () { console.log('\nthis:\n\n', this); } }; obj.show(); // obj (obj.show.bind(obj))(); // obj var newobj = new (obj.show.bind(obj))(); // newobj
3. apply、call、bind时
一般bind要优与call/apply。(call参数多,apply参数少)
1 2 3 4 5 6 7 8 9 10
functiongetColor(color) { this.color = color; console.log(this); } functionCar(name, color) { this.name = name; // this指的是实例car console.log(this) getColor.call(this, color); // 这里的this从原本的getColor,变成了car } var car = new Car('卡⻋', '绿色');
4. 箭头函数
没有自己的this,也不能被new关键字调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var a = { myfunc: function () { setTimeout(() => { console.log(this); }, 0) }, myfunc2: function () { setTimeout(function() { console.log(this); }, 0) } }; a.myfunc(); // this是a a.myfunc2(); // this是setTimeout
5. 综合应用
1 2 3 4 5 6 7 8 9 10 11
var obj = { show: function () { console.log('this:', this); } }; var elem = document.getElementById('xxx'); elem.addEventListener('click', obj.show); // 传递给了click事件,执行时相当于直接调用,this指window elem.addEventListener('click', obj.show.bind(obj)); // 显式绑定了obj,this指obj elem.addEventListener('click', function () { obj.show(); // 执行是调用出来的,this指obj });
作用域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
for (var i = 0; i < 10; i++) { console.log(i); // 0 1 2 .... 9 } for (var i = 0; i < 10; i++) { setTimeout(function () { // 时间循环,进入异步队列,调用时主栈for已执行完,i的值为10 console.log(i); // 10 }, 0); } for (var i = 0; i < 10; i++) { (function (i) { // 独立的10个作用域块了 setTimeout(function () { console.log(i); // 0 1 2 3 .... 9 }, 0) })(i); } for (let i = 0; i < 10; i++) { console.log(i); // 0 1 2 3 .... 9 }
被js变量提升影响:
1 2 3 4 5 6
var person = 1; functionshowPerson() { console.log(person); // 如果没有var定义的person那么输出是1 var person = 2; // 变量提升:函数showPerson作用域内person被提前声明初始化并赋值undefind } showPerson(); // undefined
被js函数提升影响:
1 2 3 4 5 6 7
var person = 1; functionshowPerson() { console.log(person); var person = 2; // 在函数作用域内任何地方定义此person均不会影响结果 functionperson() { } // 函数提升:提前声明初始化并赋值整个函数内容 } showPerson(); // function person() { }