次のように、クロージャー内のjsロジックを単一のjsファイルとして記述した場合、すべてうまくいきます。
(function(win){
//main logic here
win.expose1 = ....
win.expose2 = ....
})(window)
しかし、同じjsファイルでそのクロージャの前にロギング代替関数を挿入しようとすると、
window.Glog = function(msg){
console.log(msg)
}
// this was added before the main closure.
(function(win){
//the former closure that contains the main javascript logic;
})(window)
typeErrorがあると文句を言う:
Uncaught TypeError: (intermediate value)(...) is not a function
私は何をしましたか?
このエラーは、3行目にセミコロンがないことが原因です。
window.Glog = function(msg) {
console.log(msg);
}; // <--- Add this semicolon
(function(win) {
// ...
})(window);
ECMAScript仕様には、 自動セミコロン挿入のための/固有の規則があります しかし、この場合、次の行で始まる括弧で囲まれた式は関数呼び出しの引数リストとして解釈できるため、セミコロンは自動的に挿入されません。
これは、そのセミコロンがないと、無名のwindow.Glog
関数がmsg
パラメーターとしての関数で呼び出され、続いて(window)
が返されたものを呼び出そうとしていたことを意味します。
これがコードの解釈方法です。
window.Glog = function(msg) {
console.log(msg);
}(function(win) {
// ...
})(window);
エラーケース:
var userListQuery = {
userId: {
$in: result
},
"isCameraAdded": true
}
( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
出力:
TypeError: (intermediate value)(intermediate value) is not a function
修正:式を区切るセミコロン(;)がない
userListQuery = {
userId: {
$in: result
},
"isCameraAdded": true
}; // Without a semi colon, the error is produced
( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
(
、[
、 `、または任意の演算子(/、+、 - が唯一の有効なもの)で始まるすべての行は、セミコロンで始まらなければなりません。
func()
;[0].concat(myarr).forEach(func)
;(myarr).forEach(func)
;`hello`.forEach(func)
;/hello/.exec(str)
;+0
;-0
これにより、
func()[0].concat(myarr).forEach(func)(myarr).forEach(func)`hello`.forEach(func)/hello/.forEach(func)+0-0
凶悪性。
何が起こるかを言及するために、括弧はインデックスを作成し、括弧は関数パラメータとして扱われます。バッククォートは タグ付きテンプレート に変換され、正規表現または明示的に符号付き整数が演算子に変わります。もちろん、各行の最後にセミコロンを追加することもできます。ただし、プロトタイプをすばやく作成してセミコロンを削除している場合は注意が必要です。
また、各行の末尾にセミコロンを追加しても、次のようにはなりません。次のような文に注意してください。
return // Will automatically insert semicolon, and return undefined.
(1+2);
i // Adds a semicolon
++ // But, if you really intended i++ here, your codebase needs help.
上記のケースでは/ continue/break/++/ - が返されます。どんなリンターもデッドコードまたは++/ - 構文エラーでこれを捕らえるでしょう(++/ - は現実的に起こることは決してないでしょう)。
最後に、ファイル連結を機能させたい場合は、各ファイルがセミコロンで終わっていることを確認してください。バンドラープログラムを使用している場合(推奨)は、これを自動的に行うべきです。
私にとってはずっと簡単でしたが、それを理解するのにしばらく時間がかかりました。基本的には.jslibにありました
some_array.forEach(item => {
do_stuff(item);
});
Unity(emscripten?)はその構文が気に入らないことが判明しました。私たちはそれを古き良きfor-loopに置き換え、すぐに文句を言うのを止めました。私はそれがそれが不平を言っている線を示していないことを本当に嫌います、しかしとにかく、私を二度恥を欺く。
プロパティ名がメソッド名と同じである新しいES2015クラスを作成したときに、この問題に直面しました。
例えば。:
class Test{
constructor () {
this.test = 'test'
}
test (test) {
this.test = test
}
}
let t = new Test()
t.test('new Test')
この実装はNodeJS 6.10にあったことに注意してください。
回避策として(つまらない 'setTest'メソッド名を使用したくない場合)、 'private'プロパティのプレフィックス(_test
など)を使用することができます。
jsfiddle で開発者ツールを開きます。
**Error Case:**
var handler = function(parameters) {
console.log(parameters);
}
(function() { //IIFE
// some code
})();
出力:TypeError:(中間値)(中間値)は関数ではありません*式を区切るセミコラン(;)が欠落しているためIT - >の修正方法;
**Fixed**
var handler = function(parameters) {
console.log(parameters);
}; // <--- Add this semicolon(if you miss that semi colan ..
//error will occurs )
(function() { //IIFE
// some code
})();
なぜこのエラーが来るのですか?理由: ES6標準を与えられている自動セミコロン挿入のための特定の規則