javascript中的范围没有关键字var

时间:2018-02-28 05:33:07

标签: javascript scope

function jjj(asi) {
  asi=3;
}

jjj();
console.log(asi);

在这里,我认为asi是一个全局变量,但在运行此代码时,它表示未定义asi

根据我研究过的书籍和官方文档,如果你提到没有关键字var的变量名,那么它就变成了全局,所以我认为同样的规则也适用于asi变量

3 个答案:

答案 0 :(得分:2)

  

这里我认为asi是一个全局变量,但在运行此代码时,它给出的asi未定义

它会创建一个隐含的全局,如果你没有将它声明为参数,例如:



function jjj() {
//           ^---------- removed `asi` here
  asi = 3;
}
jjj();
console.log(asi);




请注意,隐式全局变量是一个非常糟糕的主意(我之所以在The Horror of Implicit Globals上调用了我的博客文章),您应该使用strict mode将它们设为错误他们应该一直是:



"use strict";
function jjj() {
  asi = 3; // ReferenceError: asi is not defined
}
jjj();
console.log(asi);




答案 1 :(得分:1)

在您的情况下,函数参数将重新分配一个新值。



function jjj(asi) {
  asi = 3 // the function argument will have new value
  mno = 4 // this will be a global variable
}
jjj();
console.log(asi);
console.log(mno);




答案 2 :(得分:0)

对于功能代码,参数也会添加为该功能环境的绑定。

从函数中删除参数以使asi表现为全局变量。



function jjj(){  asi=3; }
jjj();
console.log(asi);