在函数中为变量赋值变量

时间:2015-07-15 03:49:27

标签: javascript scope closures shadow hoisting

我试图在一个函数中为自己分配一个变量,如果该变量与函数的参数同名,它似乎不起作用,但如果它们是'不一样的名字。代码示例更清楚地显示了这一点。

我应该期待这种行为吗?这是我的d3用例的一个简化示例,它提示了这个问题。我也在下面展示过。

非工作示例

var a;

function assign(a) {
    a = a;
}
assign("test")
console.log(a)
  

未定义

工作示例

var a;

function assign(b) {
    a = b;
}
assign("test")
console.log(a)
  

测试

用例

var data
d3.csv("data.csv", function(error, data) {
    //Doesn't work for me
    data = data
}
console.log(data)
  

未定义

3 个答案:

答案 0 :(得分:5)

在你的第一个例子中,参数a传递给函数shadows变量a在外面定义,所以:a=a是参数的赋值(已传递给函数)自身。

答案 1 :(得分:1)

在Javascript中,范围是功能级别范围,因此每当引用变量时,在包含范围(函数)中搜索它的声明,如果它发现它使用它,否则它继续在全局范围内搜索原型链。因此,在您的情况下,它会尝试搜索a并将其设为参数a,因此会停止搜索a从参数中使用var a; function assign(a) { Global.a = a //Global is placeholder here for outerscope that variable a is coming from. } assign("test") console.log(a);

为了避免冲突,你有两种使用方式。

  1. 使用不同的名称
  2. 如果您想使用相同的名称,请使用显式范围解析。
  3. 实施例。

    validateMagnet: function(cellView, magnet){
        var links = graph.getLinks();
        for (var i = 0; i < links.length; i++){
            if( (( cellView.model.id  == links[i].get('source').id ) && ( magnet.getAttribute('port') == links[i].get('source').port) )||
            (( cellView.model.id  == links[i].get('target').id ) && ( magnet.getAttribute('port') == links[i].get('target').port) ))
            return false;
        }
        return true;
    },
    validateConnection: function(cellViewS, magnetS, cellViewT, magnetT, end, linkView){
        var links = graph.getLinks();
        for (var i = 0; i < links.length; i++)
        {  
            if(linkView == links[i].findView(paper)) //Skip the wire the user is drawing
            continue;
    
            if ( (( cellViewT.model.id  == links[i].get('source').id ) && ( magnetT.getAttribute('port') == links[i].get('source').port)) ||
            (( cellViewT.model.id  == links[i].get('target').id ) && ( magnetT.getAttribute('port') == links[i].get('target').port)) ){
                return false;
            }
        } 
        return true;
    }
    

    有助于更清晰理解的有用链接

答案 2 :(得分:0)

您可以使用STATIC_ROOT对象来访问全局变量。

window

有关15-common-javascript-gotchas

的更多信息