匿名函數自調用bash
for(var i = 0 ; i < 5 ; i++){
setTimeout((function(i){
console.log(i);
})(i),i*1000);
}
複製代碼
答案:0,1,2,3,4函數
解析:ui
for(var i = 0 ; i < 5 ; i++){
var fn = (function(i){
console.log(i);
})(i);
setTimeout(fn,i*1000);
}
fn匿名函數自調用當即執行,因此先打印0,1,2,3,4。而後 函數沒有返回值。因此
setTimeout(undefined,i*1000); 分別0s,1s,2s,3s,4s打印undefined。
複製代碼
逗號表達式this
var a = 10, b = 20;
function CommaTest(){
return a++, b++, 10;
}
var c = CommaTest();
alert(a);
alert(b);
alert(c);
複製代碼
答案:11 21 10spa
解析: a++ 先賦值再自增。無論怎樣,最後的值都會加1.因此a爲11,b爲21。逗號表達式返回的都是最後一個值。因此結果爲10。prototype
逗號表達式code
var out = 25,
inner = {
out:20,
func:function(){
var out = 30;
return this.out;
}
};
console.log((inner.func, inner.func)());
console.log(inner.func());
console.log((inner.func)());
console.log((inner.func = inner.func)());
複製代碼
答案:25,20,20,25cdn
解析: (inner.func, inner.func)() 是進行逗號運算符,逗號運算符就是運算前一段表達式,且返回後一段表達式的結果。匿名函數的自調用,this指向的window。因此第一個this.out指向的全局的out 爲25。 第二個和第三個都是方法調用。因此out爲20。最後一個和第一個相同。等號運算符,返回的是結果inner.func = inner.func。即20。blog
原型繼承
function superType(){
this.property = true;
}
superType.prototype.getSuperValue = function(){
return this.property
}
function subType(){ //建立子構造函數
this.subproperty = false
}
subType.prototype = new superType(); //繼承
subType.prototype.getSubValue = function() {
return this.subproperty
}
var instance = new subType() //實例
console.log(instance.getSuperValue())
複製代碼
答案:true 解析:看圖 instance經過__proto__.__proto__訪問到getSuperValue();構造函數裏的this.property爲true。因此爲true。
函數調用
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp)); 4 2
}
}
var bar = foo(2);
bar(10);
複製代碼
答案:16
解析:
bar(10) => function (y) {
alert(x + y + (++tmp)); 4 2
}
因此y爲10,由於x爲2。 (++tmp)最後結果都會自增1.因此爲 10+2+4 = 16。
複製代碼
函數聲明與調用
var funce = [];
for(var i = 0; i < 3; i++){
funce[i] = function(){
console.log(i);
}
}
for(var j = 0; j < 3; j++){
funce[j]();
}
複製代碼
答案:打印3次3
解析:
第一個for函數聲明for循環結束i爲3,但函數未調用。第二個for循環了3次分別調用了函數。因此打印了3次3。