首页 > 为什么在函数外定义的变量函数内不能使用?

为什么在函数外定义的变量函数内不能使用?

这样不行

var x = document.getElementById('x1').innerHTML;

function x(){
alert(x);
}

这样却可以

function x(){
var x = document.getElementById('x1').innerHTML;
alert(x);
}

请问为什么?


你变量的名字是一样的,js函数有提前声明,也就是说你这么声明的话,x其实是字符串,根本不是函数,不要把变量和函数的名字起成一样。


变量名和函数名一样


javascript 里面有个东西叫做变量声明提升。

第一种写法,虽然是先x定义为一个变量,然后再定义成一个函数。但实际是先x被定义为一个函数,然后再定义为一个变量,然后再赋值为那个那个DOM对象。因此最后的 x 其实是那个DOM对象,alert(x) 也是dom对象,但是这一句是在一个函数里面,由于 x 指向了另外一个对象,而不是这个函数,因此这个函数也没有办法再调用哪个了。你可以最后看一下,执行完这段代码 x 其实是那个 DOM 对象。详见:http://zonxin.github.io/post/2015/10/javascript-hoisting

第二种写法:首先 函数 x 和 变量 x 不再同一个作用域,函数 x 在全局,变量 x 在局部。所以可以被赋值为两个不同的值,虽然他们同名。
alert(x),根据变量查找的规则,首先在局部作用域找到 var x 的那个定义,因此,此处引用的是局部变量 x,也就是被赋值为DOM对象的那个。而在全局调用 x 函数的时候,由于变量 x 是局部变量,全局不可见,因此全局中的x是那个函数x。
关于作用域及闭包:https://.com/q/1010000004736461

【热门文章】
【热门文章】