首頁 >web前端 >js教程 >JS的解析順序和作用域以及嚴格模式的簡單介紹

JS的解析順序和作用域以及嚴格模式的簡單介紹

黄舟
黄舟原創
2017-10-23 09:45:491306瀏覽

一、javascript的解析順序

我們大家所理解的程式碼的執行順序都是從上到下的,但實際上確不是這樣的。我們來看看下面的程式碼。


alert(a);
var a = 1;

如果執行順序是從上到下的,在上面彈出一個a,瀏覽器會認為從上到下執行的,那麼當它alert(a)的時候,他會發現沒有這個東西,那麼他就會報錯,但是實際上他彈出來的結果是undefined。傳回值是undefined說明a沒有被定義也就是沒有賦值。下面我來講解一下javascript的解析順序。

1.ES5中有宣告意義的關鍵字

var 會存在變數提升

function也有宣告變數的作用。

2.解析順序

1.找宣告 var、function 宣告:只是宣告變量,而不包含賦值。

2. 執行

注意:以上兩步驟 都遵循從上至下,執行的時候遇到等號,先看等號的右邊。

注意:當function宣告的變數和var宣告的變數重名時,function的變數權重會比var宣告的高。

下面多來幾個例子解析一下就清楚許多了,但看例子之前要知道什麼叫作用域。

二、作用域

作用域就是:起作用的範圍分為下面兩種

1.全域作用域

2.函數作用域

他們兩個的差異看下面的例子仔細分析。

三、看幾個例子解析一下執行順序的步驟

#1. 第一個例子:


#
var x = 5;
 a();
 function a(){
  alert(x);
  var x = 10;
 }
alert(x);

解析過程

1,.尋找宣告(看全域作用域)


var x;

function a(){}

2.執行

x = 5;

a() ------------->執行到這個函數的過程中在重新進行以上兩步驟

1,尋找宣告var x;(函數作用域)

2.執行

alert(x); 這個x在函數作用域中存在,而且還沒有執行到賦值的那一步,那麼彈出的東西就是undefined;

x = 10;

alert(x) 這裡彈窗是全域變數5 ;

所以瀏覽器彈出視窗的內容是undefined 5

2. 第二個範例


 a()
 function a(){
  alert(x);
  var x = 10;
 }
alert(x);

解析過程依照上面的例子一樣分析

1. 尋找宣告

 function a(){}

2.執行

 a()------- ------------------>函數

1.尋找宣告

var x;

#2.執行

alert(x) 彈出未定義

x = 10;

#alert(x); 這裡的x會從全域中尋找x,但發現並沒有x,所以瀏覽器會報錯x is not defined x沒有被定義

所以瀏覽器的彈出的內容是undefined 報錯

我相信看了這兩個例子的人都對這個解析過程都有了清除的了解,如果還是不太了解,建議重新看一次。

下面介紹幾個需要注意的地方,直接上例子

3. 第三個例子

前面講到了當function宣告的變數和var宣告的變數重名時,function的變數權重會比var宣告的高。來一個例子證明一下


alert(a)

function a() {
 alert("函数")
}

var a = 1; 
alert(a)

解析過程

1.尋找宣告

## function a(){}

 var a;

2. 執行

alert(a) 前面說到了function的宣告比var宣告的權重高,所有執行這個的時候他會彈出這個函數塊(函數體)

a = 1;

alert(a); 這裡彈出的就是1 了

所以最後的結果就是函數區塊1;

4.第四個例子

子作用域可以向父級作用域找變量,直到全域作用域為止,反之不行。 如果子作用域有同樣的變量,那麼他就會使用自己的,不會去找爸爸要。


var a = 5;

function fn() {
 alert(a)
}

fn()

解析過程

1.尋找宣告

var a;

function fn(){}

2.執行

a = 5;

fn()----------------------- --------------->函數

1.找宣告

2.執行

#alert(a); 他這裡沒有a 所以去找爸爸要。 a = 5; 所以彈窗是5

所以最後結果為彈窗5

下面看爸爸會不會去找兒子要東西


#

function fn(){
  var b = 5; 
  return b;  
}
fn();
alert(b);

1.尋找宣告

function fn(){}

#2. 執行

fn()---------- ------------------------------>函數

1.尋找宣告

#1 .var b;

2.執行

return b;

alert(b); //我們看一下回傳值是多少b is not defined 他說b沒有被定義,說明父作用域不可以向自作用域去尋找變數。

5. 第五個例子

當一個變數無中生有時,不管從哪個作用域出來的,統統歸到window下,下面看兩個例子



fn();
 alert(a);
 var a = 0;
 alert(a);
 function fn(){
  var a = 1;
 }

這一個例子應該可以自己分析了最後的結果是undefined 0

我們再來看一下下面這個你會很驚訝



#

 fn()
 alert(a)
 var a = 0;
 alert(a);
 function fn(){
   a = 1;
 }

明明都一样,我吃惊什么 返回值不是还是 undefined 和 0 吗

但是你有没有发现倒数第二行 上面的声明了 下面的没有声明,来解析一波

1.寻找变量

var a;

function fn(){}

2.fn()---------------------------->函数

a = 1; 这个时候就说到了那一点,无中生有的变量,统统归到window下面

所以下面的执行过程

alert(a) 这里的弹窗就是 1 了

a = 0;

 alert(a) 弹出 0

所以最后的结果是 1 0

四、严格模式

严格模式下的代码执行时,非常严格

变量不允许无中生有

意义:规范代码开发的流畅,逻辑


"use strict"
a = 1;
alert(a);

当我们写后面两句代码的时候不会报错和出现问题,但是当我们加上第一句代码的时候,我们在这样写的时候就会报错了。所以我们还是按照规范的标准来,提高自己的能力

五、可能好多人做了上面的例子感觉不太过瘾,下面我再给出几个例子,可以自己去分析分析,我会在最后面给出答案。

1. 第一个例子  // 10 报错


var a = 10;
alert(a);
a()
function a(){
 alert(20);
}

2.第二个例子 undefined 1 0


var a = 0;
 function fn(){
  alert(a);
  var a = 1;
  alert(a);
 }
 fn();
 alert(a);

3.第三个例子 当同样的声明同样的名字重复时,后面写的会覆盖前面写的 //2 1 1 3


a()
 var a = function(){
  alert(1)
 }
 a();
 function a(){
  alert(2);
 }
 a();
 var a = function(){
  alert(3);
 }
 a()

如果你看到我的文章可以收获一些知识,那么我会非常高兴的。

以上是JS的解析順序和作用域以及嚴格模式的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn