Javascript按照<script>段的方式进行预编译处理相关的代码段,并且按照先预定义变量,再预定义函数的方式进行预编译!而且无论变量/函数在段中的任何地点进行显式声明(在变量前加var),都会在所有代码执行前进行预编译,并且变量的值初始为undefined,下面我们使用示例代码来说明整体的预编译情况:
<script>
var aa = "dd";
function bb() {
alert(aa);
var aa = "cc";
alert(aa);
}
bb();
</script>
上面的代码执行中alert的提示 内容为undefined和cc;为什么会是undefined? 根据预编译原则var aa因为有在bb函数中定义,因此他的作用域就是整个bb函数,而且不管它在bb函数的什么地方定义都会是在函数bb的任何代码执行前进行定义好并且赋初值为undefined;定义好变量后,开始进行代码执行,因为alert(aa)是第一行代码,这时aa=undefined,因为alert显示内容为undefined,而第二行(var aa = "cc")等aa = "cc", 为aa赋值为cc,因此后面的alert就显示为cc;
<script>
function bb() {
alert(aa);
aa = "cc";
alert(aa);
}
bb();
</script>
以上代码会报错(aa未定义),因为第一个alert之类aa未进行显式的定义(var aa);
<script>
var aa = "aa";
function bb() {
alert(aa);
aa = "cc";
alert(aa);
}
bb();
alert(aa);
</script>
以上代码返回aa和cc,cc;因为在bb函数中未显式定义变量aa,因此bb函数中访问是函数外层的aa对象,而在bb中改变了aa的值,因此最后外层的aa值变为cc;
<script>
function bb() {
aa = "cc";
alert(aa);
}
bb();
</script>
以上代码alert会显示cc,因为cc进行了隐式的定义,因此不会报错.
<script>
var aa = "dd";
function bb() {
alert(this.aa);
var aa = "cc";
alert(aa);
}
bb();
</script>
以上的的结果为:dd和cc,因为this当前的对象为window!
标签:aa,undefined,bb,之预,cc,javascript,alert,编译,var From: https://blog.51cto.com/u_15951492/6038888