1. 程式人生 > >js中變量名提升和函數名提升

js中變量名提升和函數名提升

cnblogs 約數 abc cti 但是 定義 一個 開始 bsp

首先,js中變量沒有塊級作用域,但是有函數作用域,即只有函數可以約數變量的作用域。

並且,函數的實質也是一個變量,所以可以改變它的值,即賦值。所以變量名提升和函數名提升非常相像。

1.變量名的提升發生在函數內部。看下面的例子。說明:第一個因為彈出undefined,相當於在上面定義了var num;因為函數內部,定義了var num=20;就相當於在一開始定義了var num;這就是變量名的提升。

    var num = 10;

    function func() {
        alert(num); //undefined
        var num = 20;
        alert(num); 
//20 } func(); alert(num) //10

相當於:

var num = 10;

    function func() {
        var num;
        alert(num); //undefined
        var num = 20;
        alert(num); //20
    }
    func();
    alert(num) //10

如果沒有var

var num = 10;

    function func() {

        alert(num); //10
        num = 20;
        alert(num); 
//20 } func(); alert(num) //20

函數嵌套道理一樣

 var num = 10;

        function func() {
            alert(num); //undefined
            num = 20;

            function func1() {
                alert(num); //undefined
                var num = 40;
                alert(num) //30
            }
            func1()
            alert(num); 
//20 } func(); alert(num) //10

2.函數名提升發生在lambda函數上,即匿名函數。和變量名提升一個道理。

        var func = function () {
            alert("abc")
        };

        function func1() {
            func(); //func is not a function
            var func = function () {
                alert("123")
            };
            func()
        }
        func1();

省去var

  var func = function () {
            alert("abc")
        };

        function func1() {
            func(); //abc
            func = function () {
                alert("123")
            };
            func()//123
        }
        func1();

改變函數,不使用匿名函數

        var func = function () {
            alert("abc")
        };

        function func1() {
            func(); //123
            function func() {
                alert("123")
            };
            func()//123
        }
        func1();

js中變量名提升和函數名提升