javascript代码的执行顺序

来源:互联网 发布:礼德财富怎么样知乎 编辑:程序博客网 时间:2024/06/06 03:38
javascript给人的直观感受是,从上往下执行,但实际上却不是这样的,先看个例子。

 console.log(test); //undefined
 var test = "你好";
 console.log(test); //"你好"
 console.log(test2); //Uncaught ReferenceError: test2 is not defined

 //模拟编译和执行

 var test;//最先编译出来
 test = "你好";//执行的时候,赋值给test

  按理说这样写,应该会报错因为函数还没定义就执行了,但实际运行的时候却没有报错。为什么呢?因为javascript执行时,在同一个作用域内是先编译再执行。编译的时候会编译function和var这两个关键词定义的变量,编译完成后从上往下执行并向变量赋值。所以test执行之前, var test 已经执行过了,所以test不会报错,而test2就会报错。

下一个例子:
  test();//执行结果是"你好"
  function test() {
    console.log("你好");
  }

  //模拟编译和执行
  var test = function(){}//编译时把方法赋值给test
  test();//执行
  console.log(test); //把函数打印出来了

function和var是有些不一样的, function编译时会把function赋值给test, 然后再往下执行。

还有另外的坑人的例子:

 console.log(test) //undefined
 test(); //执行结果报错 Uncaught TypeError: test is not a function

 var test = function() {
  console.log("你好");
 }

 //模拟编译和执行
 var test;//先编译找到关键字var
 test = function() {//然后赋值
   console.log("你好"); 
 }

  上面这个例子的function是以赋值的形式给test的,编译的时候只编译了var test,所以执行的时候从上往下执行,test()会报错。
变量提升

  var a = 1; 
  function test() {
   a = 2;
   return;
   function a() {}
 }

 test();
 console.log(a); //结果还是1

  为什么结果是1不是2? 因为a = 2是局部变量,那为什么a变成了test里面的局部变量了呢?因为javascript是在同一个作用域内先编译后执行,test里面有一个 function a(),遇见关键字function了就要编译,前面讲过function怎么编译执行的,所以a = 2就变成局部变量了,所以最后执行结果a=1。

总结一下: javascript就是在同一个作用域内先编译后执行,记住这句话就行了。
0 0
原创粉丝点击