`

JS变量随便写写

阅读更多
一般来说js全局变量分为显式定义和隐式定义,分别是加var和不加var的区别,试了试发现在实际创建中两者还是有区别的,自己不太懂底层,所以只能凭代码运行说话了。

代码一
func();//正确执行
alert(param1);//undefined
		    
var obj=window;
for(o in obj){
    if(o!='external'){
        $("div").append(o+" "+obj[o]+"</br>");
    }
}
var param1=100;
var param2=[];
function func(){
    zs="111";
    alert(zs);
}

显式的定义了param1 param2,zs则是隐式的定义,前面for是循环出window里所有的变量
以上代码运行出来是
param1 undefined
param2 undefined
obj [object Window]
func function func(){ zs="111"; alert(zs); }
zs 111

可以看出虽然代码里param1,param2,func都是在for循环下创建的,但是实际在window里已经把param1和param2定义好了,由此可见js会不论前面带var的变量放到哪个位置,都会按照先后顺序先在顶上创建好,但是未赋值。而函数同样也定义到顶上,以上代码实际定义大概类似于下面

var param1,param2,obj;

function func(){
    zs="111";
    alert(zs);
}

func();
alert(param1);
		    
obj=window;
for(o in obj){
    if(o!='external'){
        $("div").append(o+" "+obj[o]+"</br>");
    }
}

param1=100;
param2=[];


但是如果去掉代码一里param1和param2前的var再运行,alert(param1)则会直接报错,提示param1 is not defined,没定义,所以如果隐式创建,则必须运行到变量所在创建位置才会创建这个变量

另外如果去掉代码一里的func();则zs这个全局函数是不会被创建的。可见js里全局变量是可以被动态创建的

同理var func=function(){....}的时候,会先创建一个叫func值为undefined的变量,当运行到赋值的时候才把函数赋给func,所以如果代码一中改成这种方式,在上面运行func()同样会报错,但function func(){}则不会报错。function前置的定义函数方式不论在js哪个地方定义,都能执行到。

关于<script></script>域的运作方式是:是执行完一个<script></script>中的代码再执行下一个<script></script>中的代码,这样上面
    func()
    function func(){}

如果写成这样就会报错不执行了
<script>
    func()
</script>
<script>
    function func(){}
</script>
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics