注入函数中的Javascript范围

时间:2012-07-21 11:43:12

标签: javascript scope

(function(){
    var privateSomething = "Boom!";
    var fn = function(){}
    fn.addFunc = function(obj) {
        alert('Yeah i can do this: '+privateSomething);
        for(var i in obj) fn[i] = obj[i];
    }
    window.fn=fn;
})();

fn.addFunc({
    whereAmI:function()
    {
        alert('Nope I\'ll get an error here: '+privateSomething);
    }
});

fn.whereAmI();

为什么whereAmI()无法访问privateSomething?以及如何将whereAmI()放在与addFunc()相同的上下文中?

2 个答案:

答案 0 :(得分:4)

Javascript是词法范围的:名称是指基于名称定义位置的变量,而不是名称的使用位置。在privateSomething中查找whereAmI作为本地,然后在全局范围内查找{{1}}。在其中任何一个地方都找不到。

答案 1 :(得分:2)

JavaScript具有词法作用域,而不是动态作用域(除this之外)。见http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_and_dynamic_scoping