函數與原型

匿名函數自調用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。

相關文章
相關標籤/搜索