javascript - 维护范围

标签 javascript jquery scope this

我有一个关于在对象中维护 this 范围的一般性问题。这是一个简化的代码片段。记下 var that = this 行和我调用 that.showMenu() 的事件处理程序内部。

var MyObj = {
    init : function(target){
        this.$Target = $(target);
        this.$Menu = $(target).find('.menu');
        this.eventBindings();
    },
    eventBindings : function(){
        var that = this;
        this.$Target.on('click', '.anchor', function(e){
            e.preventDefault();
            that.showMenu();
            //some other code
        });
    },
    showMenu : function(){
        this.$Menu.show();
    }
};
MyObj.init('.myTarget')

代码应该是不言自明的。通常我尝试在我的 eventBindings() 之外创建可重用的方法。我不断遇到的问题是将引用 MyObjthis 传递到事件处理程序中,这样我就可以调用 this.showMenu()

为了克服障碍,我总是将 this 分配给一个名为 that 的变量,这样当我进一步深入范围时,我就有了一个引用。但我觉得这不是最好的方法...有人可以提出更好的选择吗?

最佳答案

你正在做的是最好的方法。在 Javascript 中,this 的作用域是动态的(绑定(bind)取决于堆栈,即函数被调用的位置),所有其他变量的作用域是静态的(绑定(bind)取决于变量在你的代码中的静态位置)代码)。

并且由于 Javascript 以特殊方式处理 this,所以也不要因为以特殊方式处理它而感到难过。

您可以将您现在正在做的事情封装在一个函数中——许多库都提供了这样的功能,它通常被称为“绑定(bind)”。但这不会改变真正发生的事情,只会隐藏它(并在这样做时消耗一些资源)。这样的函数看起来有点像:

function whatever (functionToProcess, thisToFreeze) { 
   return function() {
       functionToProcess.apply(thisToFreeze, arguments); // apply is built in
   }
}

关于javascript - 维护范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15959136/

相关文章:

php - Javascript 和 jQuery 转义引号

javascript - jQuery UI 日期选择器在显示年份菜单时无法显示完整的年份

javascript - 有没有一种方法可以仅使用 Javascript 从文件夹中返回所有图像文件名的列表?

javascript - 我可以在匿名范围内更改 Javascript 闭包中引用的函数吗

c - C中的静态局部变量地址

javascript - 将二维体素图转换为线的算法有时会卡住

javascript - 如何按一个属性对数据进行分组并获取其他属性的合并数组?

jquery - 使用 jquery 绑定(bind)下拉列表

javascript - NodeJS MongoDB 游标 toArray 回调函数不会对父范围变量进行更改

javascript - 正则表达式用于获取最后一个空格的值