亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaScript 代碼塊有時會拋出錯誤

JavaScript 代碼塊有時會拋出錯誤

楊魅力 2022-12-29 16:42:49
我正在使用代碼塊來模擬 la C 中的靜態函數變量。這是基本設置:{    let bob = 5;    function b() {        console.log(bob++);    }}現在在 chrome 中,這個編譯很好,沒有任何抱怨。然而,在 Safari 中,我得到一個SyntaxError: Unexpected identifier 'bob'. Expected a ':' following the property name 'let'.我不知道是什么導致了這種差異,因為 Chrome 和 Safari 都處理 ECMAScript 6。
查看完整描述

2 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

問題是代碼處于松散模式并且您在塊中聲明一個函數。塊中的函數聲明僅在 ES2015 中標準化,嗯,它們在嚴格模式下有意義,但在松散模式下它們……很奇怪。


在strict mode中,您的代碼可以正常工作,可能如您所料,也可能不會。bob可以訪問b...并且在該塊之外既bob不能b訪問也不能訪問,除非你做一些事情將它們暴露在它之外。


這是一個示例,您可以使用它在 Safari 和 iOS Safari 上進行測試(我只有后者可用)。這個版本報錯:


<script>

window.onerror = e => {

    document.body.insertAdjacentText("beforeend", String(e));

};

</script>

<script>

{

    let bob = 5;

    function b() {

        document.body.insertAdjacentText("beforeend", bob++);

    }


    b();

}

</script>

錯誤是:


ReferenceError: Can't find variable: bob


這個版本有效:


<script>

window.onerror = e => {

    document.body.insertAdjacentText("beforeend", String(e));

};

</script>

<script>

"use strict"; // <============================

{

    let bob = 5;

    function b() {

        document.body.insertAdjacentText("beforeend", bob++);

    }


    b();

}

</script>

我還在最新版本的 JavaScriptCore(Apple 的 JavaScript 引擎)v265499 中復制了該行為。我安裝了1 并在本地運行它(將console.log/更改insertAdjacentText為print,這在大多數原始引擎可執行文件中都可用)并在松散模式下出現相同的錯誤,而不是在嚴格模式下。


如果你想b在街區外可用,你最好做這樣的事情:


"use strict";

const b = (() => {

    let bob = 5;

    return function b() {

        console.log(bob++);

    };

})();

b();

這要大得多,但是......或者,使用let:


"use strict";

let b;

{

    let bob = 5;

    b = function b() {

        print(bob++);

    };

}

b();

1 使用非常方便的jsvu實用程序。



查看完整回答
反對 回復 2022-12-29
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

根據錯誤消息,Safari 將您的塊解釋為對象文字。語法是有效的,但 Safari 似乎對此感到窒息。


當我在自己的控制臺中嘗試這個時,我能夠通過緊跟在塊后面的語句來讓它工作:


{ let bob = 5; function b(){ console.log(bob++); } } console.log('foo');

但是,這似乎在不創建閉包的情況下將函數提升到塊作用域之外,導致ReferenceError聲稱它找不到 variable bob。


我嘗試將它顯式包裝在一個函數中并使用use strict聲明啟動該函數,以防它未在嚴格模式下運行,因為這會改變行為:


function strict() {

  'use strict';

  {

    let bob = 5;

    function b() {

      console.log(bob++);

    }

    return b;

  } 

}

strict()();

它奏效了!


長話短說:博士;松散模式下的塊處理很奇怪。在塊內定義函數時使用嚴格模式。


查看完整回答
反對 回復 2022-12-29
  • 2 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號