难以理解Javascript代码段

时间:2018-07-10 02:25:46

标签: javascript

我正在尝试将一些javascript移植到actionscript3。我是javascript的新手,虽然js的很多人都很熟悉,但是我却花了一些时间来解释一些js代码。全局变量“ action”似乎是在函数原型调用中定义的,随后在脚本主体中显然将其引用为函数参数:

变量“动作”定义:

function SteppedAction(proUpdater, unbrInterval, slInterval) {
}

SteppedAction.prototype.getResult = function 
    SteppedAction_getResult(recipient)
    {
    this.subactions.push({
        action: function(action)
        {
            // function body
        },
        prop: 0
    });
    return this;
};

在脚本主体中,即使在其他匿名函数中将其定义为函数参数本身,并在generatePl()函数中将其定义为参数,该相同的“动作”似乎在其他函数中也再次被引用。 :

function generate () {
    activeAction = new SteppedAction(updateProgressUI)
        .executeSubaction(function(action) { ui.progressPanel.show(); }, 0)
        .executeSubaction(function(action) { generatePl(subdivs, 
        dist, count, rate, level, action); });
}

我正在使用Sublime Text来帮助解释JavaScript,并且当我将鼠标悬停在脚本中任意位置的任何“动作”命名变量上时,无论是作为函数参数还是函数调用参数,它都引用了原始的“动作”上面给出的定义。我根本不明白这一点。除非匿名函数中的函数参数可以某种方式获取全局范围,否则函数参数如何“知道”它是指原始变量定义?我通常不使用匿名函数。

SteppedAction.executeSubaction()的代码为:

SteppedAction.prototype.executeSubaction = function 
    SteppedAction_executeSubaction(subaction, proportion, name) {
    proportion = (typeof(proportion) === "number" && proportion >= 0) ? 
    proportion : 1;
    this.subactions.push({ action: subaction, proportion: proportion, 
    name: name });
    return this;
};

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

对该问题的简短回答是,函数声明的变量名独立于其周围的主体。变量名称将“阴影”任何先前声明的变量。例如:

ggplot(newtbl,aes(x=types,y=value,fill=variable)) +
                     geom_bar(stat='identity')

您会注意到,在这种情况下,即使const action = "local variable"; const myFn = (action) => console.log("inside fn, action is", action); myFn("other variable")的函数参数为myFn,它在外部范围内也完全独立于action

类似地,请注意action会将功能存储为操作,而不执行该操作。这是一个示例:

this.subactions

请注意,与上面的非常相似,const subactions = []; const myFn = (action) => console.log("calling myFn with", action); console.log("about to push subactions"); subactions.push({action: myFn}); console.log("action pushed"); console.log("calling myFn"); subactions[0].action("other variable");的{​​{1}}参数在被调用之前没有设置,并且与外部作用域无关。我希望这能解决您的问题。

附录

我整理了您的代码段,如果有帮助,这是您代码的ES2015版本。希望语法可以更容易理解。

action

答案 1 :(得分:0)

因此,这是我通过摆弄文本编辑器而发现的(至少是Sublime Text文本编辑器的工作方式):当在全局级别定义一个函数时(命名或分配给变量或对象) ,该函数显然会分配一个在程序其余部分中引用的名称空间,包括函数参数定义和参数。

因此

myArray.push(action: function(x){});

var action = function(x){};

function action(x){}

所有人都将使用“动作”标识符(包括在函数参数签名中)为将来的调用创建对自身的引用,从而使参数“动作”位于

var myFunction(action) {}
当鼠标悬停在

上时,它会引用上面的所有三个函数声明,并给出在其中定义/声明的行号。这似乎仅在全局函数声明中发生。像函数声明这样的函数参数签名中不会引用具有单个值的常规全局变量。

只要这是Sublime Text本身的一个怪癖,而不是javascript中的一些奇怪约定,在javascript中,全局函数声明会在后续函数参数签名中创建名称空间问题,因此我可以理解它,以后再忽略它。感谢您的帮助!