栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用回调和闭包时在Javascript中保留对“ this”的引用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用回调和闭包时在Javascript中保留对“ this”的引用

处理

this
回调的主要方法有三种:

1.按照当前操作,创建一个词法范围的变量

此新变量的两个最常见的名称是

that
self
。我个人更喜欢使用,
that
因为浏览器具有一个名为self的全局窗口属性,而我的linter会在我遮挡它时抱怨。

function edit(req, res) {    var that = this,    db.User.findById('ABCD', function(err, user){        that.foo(user);    });};

这种方法的一个优点是,一旦代码转换为使用代码,

that
您就可以根据需要添加任意数量的内部回调,并且由于词法作用域,它们都将无缝运行。另一个优点是它非常简单,即使在古老的浏览器上也可以使用。

2.使用.bind()方法。

Javascript函数具有一种

.bind()
方法,可让您创建具有固定的版本
this

function edit(req, res) {    db.User.findById('ABCD', (function(err, user){        this.foo(user);    }).bind(this));};

当涉及到处理时

this
,bind方法对于其中一种回调特别有用,在这种回调中,必须添加包装函数会更加冗长:

setTimeout(this.someMethod.bind(this), 500);var that = this;setTimeout(function(){ that.doSomething() }, 500);

其主要缺点

bind
是,如果您具有嵌套的回调,则还需要调用
bind
它们。此外,IE <=
8和其他一些旧的浏览器
并没有本地实现该
bind
方法,因此,如果仍然需要支持它们,则可能需要使用某种匀场库。

3.如果需要对函数范围或参数进行更细粒度的控制,请退回到.call()和.apply()

更原始的方式来控制功能参数在Javascript中,包括

this
,都是
.call()
.apply()
方法。它们使您可以使用任何对象作为对象并将其
this
值作为参数来调用函数。
apply
对于实现可变参数函数特别有用,因为它以数组形式接收参数列表。

例如,这是bind的一个版本,它接收要作为字符串进行绑定的方法。这使我们

this
仅写下一次而不是两次。

function myBind(obj, funcname){     return function(){         return obj[funcname].apply(obj, arguments);     };}setTimeout(myBind(this, 'someMethod'), 500);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号