我试图在一个函数中为自己分配一个变量,如果该变量与函数的参数同名,它似乎不起作用,但如果它们是'不一样的名字。代码示例更清楚地显示了这一点。
我应该期待这种行为吗?这是我的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)
未定义
答案 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);
。
为了避免冲突,你有两种使用方式。
实施例。
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)