为函数创建新上下文

时间:2015-06-04 11:31:02

标签: javascript scope

假设我有这样的ajax调用:

$.ajax({
     ...
     success : someFn
})

在代码审核中,他们询问someFn可以访问哪些环境?他们更担心的是,所有变量,范围someFn都可以访问,以及我将如何管理someFn中所做的更改。

例如:if:

someFn : function()
{
    //1. changes some object value
    //2. Works based on some scope variables
}

现在的问题是:

  1. 如何将范围变量发送到someFn并对其进行推理?
  2. 如果范围变量是对另一个对象的引用,我应该如何在someFn内处理这些更改。
  3. 提前致谢

2 个答案:

答案 0 :(得分:3)

someFn范围内的变量取决于定义someFn的位置,而不是您使用它的位置。在您的ajax调用中使用它不会授予它访问它无法访问的任何内容。

函数范围中的变量是其创建范围内的变量,它们是:创建它的上下文的本地,包含该上下文的上下文,包含那个上下文,等等通过全局上下文。

所以:

function foo() {
    var a;

    function bar() {
        var b;
    }

    return bar;
}

foo中的代码可以访问所有全局变量,也可以访问其局部变量abar可以访问所有全局变量,a变量由调用创建foo的{​​{1}}创建的bar变量,以及(当然)其局部变量b

更多(在我的博客上)Closures are not complicated

如果您需要从ajax上下文传递给someFn的上下文信息,则需要定义一个新函数,将该信息作为参数传递给someFn。 (显式地,或使用Function#bind,它创建一个新函数,在调用时,调用具有特定this值的原始函数和您给出的任何其他参数bind。)

答案 1 :(得分:0)

  1. 通过

    将范围变量传递给someFn
    success : function(){
          someFn(scope_var1, scope_var2);
    }
    
    • 您也可以使用bind方法来保留此上下文
  2. 如果您对该对象进行更改,请考虑它会影响使用它的任何人。您可以克隆对象$.extend(true,clonedObj,someObj)