補充上一篇,嚴格模式下不同場景下函式引數名的區別

憨憨欣發表於2020-11-01

三、嚴格模式下不同場景的區別(函式引數名的區別)

1、引數名必須唯一

在嚴格模式下,要求命名函式的引數必須唯一。嚴格模式下重新命名引數被認為是語法錯誤。

示例程式碼如下:

// 開啟嚴格模式
'use strict'
function fun(a,a,b) {
    console.log(a+a+b);
}
// 非嚴格模式下呼叫不會報錯,但嚴格模式下會報錯,引數名重複
fun(2,3,4);//10

2、arguments的不同

在嚴格模式下,arguments物件的行為也有所不同。

  • 非嚴格模式下,修改形參的值也會反映到arguments物件中。
  • 在嚴格模式下,形參與arguments物件是完全獨立的。

示例程式碼如下:

// 開啟嚴格模式
'use strict'
function fun(value) {
    var value = '豬豬俠';
    console.log(value);//豬豬俠 ->就近原則
    console.log(arguments[0]);
}
fun('超人強');//非嚴格模式下,arguments物件獲取的值與形參有關。

3、arguments.callee()

在嚴格模式下,不能使用arguments物件的callee()方法。

  • 非嚴格模式下,使用arguments物件的callee()方法,表示呼叫函式本身。
  • 在嚴格模式下,使用arguments物件的callee()方法,結果丟擲異常。

示例程式碼如下:

'use strict'
function fun() {
    console.log(arguments.length);//0
    // 在嚴格模式下無法呼叫arguments的callee方法
    console.log(arguments.callee);
}
fun()

4、函式宣告的限制

在嚴格模式下,只能在全域性域和函式域中宣告函式。

  • 非嚴格模式下,任何位置宣告函式都是合法的。
  • 在嚴格模式下,除在全域性域和函式域中宣告函式是錯誤語法。

示例程式碼如下:

// 開啟嚴格模式
'use strict'

// 在全域性作用域
function fn() {
    // 在函式作用域
    function n() {
    }
}
// 在嚴格模式下,函式的定義只能在全域性作用域與函式作用域(不能在塊級作用域定義函式 )
for (var i=0;i<10;i++){
    //ECMAScript 6新增 - 存在著塊級作用域
    var v = 100;
    function f() {//非函式作用域宣告函式,語法報錯
        console.log('this is a function');
    }
}
console.log(v);
f();

相關文章