在讲述闭包之时,碰到一段代码,让我百思不得其解。代码如下:
var Type = {};
for ( var i = 0, type; type = [ 'String', 'Array', 'Number' ][ i++ ]; ){
(function( type ){
Type[ 'is' + type ] = function( obj ){
return Object.prototype.toString.call( obj ) === '[object '+ type +']';
}
})( type )
};
Type.isArray( [] ); // 输出:true
Type.isString( "str" ); // 输出:true
js中标准for循环有三个参数
for(参数一;参数二;参数三){
循环体
}
其中参数为空可以写为for(;;)。
参数一: 循环的初始值。
参数二:循环条件。
参数三:每次执行完 循环体之后,需要做的改变。
循环体:每次循环需要执行的内容。
注意:在for循环中,如果当前执行条件不满足循环条件会直接跳出循环。
在这里我是不太明白 type = [ 'String', 'Array', 'Number' ][ i++ ] 这一段的循环条件的,因为它没有结束循环的条件,但这里其实有隐藏的终止条件。
type = [ 'String', 'Array', 'Number' ][ i++ ]; 等价于 type[0], type[1], type[2] 对应输出结果为'String', 'Array', 'Number'。下一次的循环条件变为了type[3],此时 type[3]输出结果为undefined,循环条件终止,跳出循环。
Type 循环3次获得三个方法。
现在将这段代码改为标准for循环代码如下
var Type = {};
var type = [ 'String', 'Array', 'Number' ];
for ( var i = 0; i<type.length; i++){
(function( type, i ){
Type[ 'is' + type[i] ] = function( obj ){
return Object.prototype.toString.call( obj ) === '[object '+ type[i] +']';
}
})( type, i )
};
Type.isArray( [] ); // 输出:true
Type.isString( "str" );// 输出:true