【《你不知道的JS(中卷)》】二、this详解
2021-02-04 17:14
标签:操作符 构造函数 var efi 使用 time OLE on() glob ? 这一章将详细分析this的各种绑定方式。 ? 要理解绑定方式,首先需要理解 调用位置。 ? \(调用位置\to 调用栈(为了到达当前执行位置所调用的所有函数)\) ? 可以看作是当其他绑定规则无法应用时的默认规则:this指向全局作用域(use strict时为undefined) ? 应用于调用位置具有上下文对象时。 尽管在JS中不能说obj对象拥有foo函数。但是在上列中调用位置会使用obj上下文调用函数,在函数调用时可以说obj“拥有”这个函数。 call(), apply()方法,将对象绑定到this,接着在调用函数时指定这个this。 但是显式绑定仍然无法解决 丢失绑定问题。 创建一个包裹函数,传入所有的参数并返回接收到的所有值。 由于硬绑定非常常用,因此ES5中内置了bind方法: ? 第三方库的许多函数,以及JS语言和宿主环境中许多新的内置函数,都提供了一个可选的参数,通常被称为“上下文”(context),其作用和bind一样,确保你的回调函数使用指定的this。 ? 在传统的面向对象语言中,new是构造函数的特殊方法。而在JS中,构造函数只是一些使用new操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。更不是特殊的函数类型,只是被new操作符调用的普通函数。 ? 使用new调用函数时自动执行以下操作: \(new>显式>隐式>默认\) ? 将null或者undefined作为this的绑定对象传入call、apply或者bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。 ? 箭头函数不适用于this的规则,而是由外层(函数或者全局来决定this)。 箭头函数可以像bind(..)一样确保函数的this被绑定到指定对象,此外,它用更常见的词法作用域取代了传统的this机制。 【《你不知道的JS(中卷)》】二、this详解 标签:操作符 构造函数 var efi 使用 time OLE on() glob 原文地址:https://www.cnblogs.com/enmac/p/13138271.html二、this全面解析:
一)、调用位置:
function baz() {
// 调用栈: baz
// 调用位置: 全局作用域
console.log("baz");
bar();
}
function bar() {
// 调用栈: baz -> bar
// 调用位置: baz函数中
console.log("bar");
foo();
}
function foo() {
// 调用栈: baz -> bar -> foo
// 调用位置: bar函数中
console.log("foo");
}
baz();
二)、绑定规则:
1、默认绑定:
2、隐式绑定:
function foo() {
console.log(this.a);
}
var obj = {
a: 2,
foo: foo
};
obj.foo(); // 2
引用丢失:
var obj = {
a: 2,
foo: foo
};
// bar是一个obj.foo的引用,但实际上是foo的引用,因此此时适用于默认绑定
var bar = obj.foo;
var a = "oops, global";
bar(); // oops, global
3、显式绑定:
function foo() {
console.log(this.a);
}
var obj = {
a:2
};
foo.call(obj); // 2
1)、硬绑定:
// ...
var bar = function() {
foo.call(obj);
}
setTimeout(bar, 100000);
var bar = foo.bind(obj);
2)、API调用的“上下文”:
function foo(el) {
console.log(el, this.id);
}
var obj = {
id: "awesome";
};
// 调用foo(...)时把this绑定到obj
[1, 2, 3].forEach(foo, obj);
// 1 awesome 2 awesome 3 awesome
4、new绑定:
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log(bar.a); // 2
三)、优先级:
四)、绑定例外:
1、被忽略的this:
2、间接引用:
function foo() {
console.log(this.a);
}
var a = 2;
var o = {a: 3, foo: foo};
var p = {a: 4};
o.foo() // 3
// 赋值表达式的返回值是foo的引用,因此调用位置为foo(),因此应用默认绑定
(p.foo = o.foo); // 2
3、软绑定:
五)、this词法:
箭头函数:
function foo() {
return (a) => {
console.log(this.a);
};
}
var obj1 = {
a: 2
};
var obj2 = {
a: 3
};
var bar = foo.call(obj1);
bar.call(obj2); // 2
文章标题:【《你不知道的JS(中卷)》】二、this详解
文章链接:http://soscw.com/index.php/essay/50983.html