我遇到了一些我之前没见过的语法:http://appendto.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/
(function( skillet, $, undefined ) {
//Private Property
var amountOfGrease = "1 Cup";
//Public Method
skillet.toString = function() {
console.log( skillet.quantity + ' ' +
skillet.ingredient + ' & ' +
amountOfGrease + ' of Grease' );
console.log( isHot ? 'Hot' : 'Cold' );
};
}( window.skillet = window.skillet || {}, jQuery ));
据我所知,作者正在检查skillet
对象的全局范围,并将其传递给IIFE(如果存在),我对传递window.skillet = window.skillet
的值有点不清楚是
作业评估作业的价值:
var x = 1;
var y = x = x;
console.log(y); //1
console.log(y = (x = x)); true
但是如果window.skillet
未定义,那么因为它是假的,为什么作者不会简单地传递这个:
( window.skillet || {}, jQuery )
答案 0 :(得分:1)
作者的做法将确保window.skillet
不再是undefined
,如果它是第一位的话。然后,传入该值。您建议的方式将最终传递相同的值,但window.skillet
仍将是未定义的。
作者可以做以下事情以使其更具可读性:
// preceding code....
if(!window.skillet) {
window.skillet = {};
}
}( window.skillet, jQuery ));
答案 1 :(得分:0)
它保证在执行此代码行之后定义window.skillet。如果它之前未定义,它现在将包含一个空对象。
这是一个较短的版本:
window.skillet = window.skillet || {};
(function( skillet, $, undefined ) {
//...
};
}( window.skillet, jQuery ));
// at this point window.skillet is guaranteed to be defined
如果您希望代码可读,则使用包含赋值的表达式并不是一个好主意,但它可以使您的代码显着缩短。