一、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中文網其他相關文章!