当前位置:首页 > Web开发 > 正文

依次是: function a(){alert(4);} 1 1 3 3 报错:a is not a function

2024-03-31 Web开发

function a(){alert(2);}

alert(a);

var a =3;

alert(a);

function a(){alert(4);}

alert(a);

a();

</script>

功效看得出来吗?

揭晓功效,依次是:

function a(){alert(4);}

1

1

3

3

报错:a is not a function

详解:

预解析阶段:按照var function 参数……等来找对象

首先,a=undefined;

其次,a=function a(){alert(2);}; //笼罩失前面的:a=undefined;

---注意:遇到重名的,只留下一个;变量和函数重名,就只留下函数;---

再次,a=undefined; //与函数重名,只留下一个,a依然即是function a(){alert(2);}

最后,a= function a(){alert(4);}//笼罩失前面的:a=function a(){alert(2);} ;此时a=function a(){alert(4);}

因此,预解析完毕时:a = function a(){alert(4);}

逐行解读代码:每次读取的时候,都是先去找货仓里面的对象

第一个alert(a); 弹出:function a(){alert(4);}

下一行 var a = 1 ,这是个表达式,它能改削预解析后货仓里面的值;

因此执行var a =1之后;a= functioni a(){alert(4);} 将被改削为 a = 1

第二个alert(a); 弹出:1

再下一行 function a(){alert(2);},这是个函数声明,不是表达式;所以,它不会转变货仓里面的任何对象;(a依然即是1)

于是,继续往下读;

第三个alert(a); 弹出: 1

接下来 var a = 3又是个表达式,于是执行之后,货仓里的“a = 1” 又将会被变动为“a = 3”;

第四个alert(a); 弹出:3

接下来又遇到一个函数声明:function a(){alert(4);},函数声明不会去转变货仓里面的值,因此a 依然即是3;

第五个alert(a); 弹出:3

最后的a(); 看起来是个函数挪用,但是要注意:你所看到的代码,并不是JS解析器看到的代码【此时我们的JS解析器中独一有的对象就是 "a = 3",,但是已经没有任何的函数了 】

那么这时的a(); 就相当于3(); //这个语法是ECMAscript 不撑持的;这时会报错:a is not a function;

JS全局与局部感化域解析、感化域链(上)

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31083.html