将不同的范围绑定到ES6 =>函数操作符
Binding different this scope to ES6 => function operator
在使用ES6提供的=>特性尝试继承上下文后,我注意到这个上下文永远不能更改。例子:
var otherContext = {
a: 2
};
function foo() {
this.a = 1;
this.bar = () => this.a;
}
var instance = new foo;
instance.bar(); // returns 1
instance.bar.bind(otherContext)(); // returns 1
不带=>操作符并使用function关键字:
function foo() {
this.a = 1;
this.bar = function () {
return this.a;
}
}
var instance = new foo;
instance.bar(); // returns 1
instance.bar.bind(otherContext)(); // returns 2
因此,如果我们从外部调用接收一个函数,或者只是在变量中有一个函数,我们如何确定我们是否能够将不同的this绑定到它,或者它是否只是从某处继承它?
这听起来很危险,javascript什么都不告诉你,你可能会陷入一个非常微妙和困难的错误。
这实际上只是bind
的新语法,因此这不会以陷阱的方式引入任何新的内容。
var otherContext = {
a: 2
};
function foo() {
this.a = 1;
this.bar = function () { return this.a }.bind(this);
}
var instance = new foo;
log(instance.bar()); // returns 1
log(instance.bar.bind(otherContext)()); // returns 1
function log(value) {
document.body.appendChild(
document.createTextNode(value)
);
}
因为:因此,如果我们从外部调用接收一个函数,或者只是在变量中有一个函数,我们如何确定我们是否能够将不同的this绑定到它,或者它是否只是从某处继承它?
- 你首先要写这个函数或
- 你已经写了一个如何调用你的函数的规范,这样人们就知道从你选择的上下文中传递一个使用
this
的函数。
当使用function
关键字时,绑定this
的规则相当直接。
调用调用设置this
(通过.call
, .apply
或JavaScript设置this
,当函数作为方法调用时)或this
获得一个众所周知的值:
- 在正常模式下,
this
将是窗口对象。 - 严格模式下,
this
未定义。
对于箭头函数,规则更简单。
- 没有
this
关键字。(没有参数,或其他一些)
这意味着,在箭头函数中,this
总是绑定到外部上下文,因为这是this
的来源。
所以,总结一下:
使用箭头函数时,this
的值总是来自外部上下文
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 简单的javascript游戏:由于构造函数或条件操作符导致的对象创建错误
- 将不同的范围绑定到ES6 =>函数操作符
- 在JavaScript中使用new操作符声明函数的优点是什么?
- JavaScript类函数此操作符
- 在javascript中使用函数创建对象与使用new操作符一样好
- 在prototype上定义函数的箭头操作符