var p = {}; p.name = '中國人'; p.age = '500';
function Person(name, age) { this.name = name; this.age = age; } var p = new Person('中國人', 500); var p2 = new Person('中國人2', 500);
function P() {} P.prototype.fun = function(){}; var p = new P();
function P() {} P.prototype = { constructor: P, fun: function(){} }; var p = new P();
function P() {} extend(P.prototype, {}, { fun: function(){} }, { fun2: function(){} }); var p = new P();
var proObj = { fun: function(){} }; var p = Object.create(proObj);
function extend() { var target = arguments[0]; for(var i = 1, len = arguments.length; i < len; i++) { for(var key in arguments[i]) { target[key] = arguments[i][key]; } } return target; }
謹記:函數調用時,內部的this的值和這個函數定義無關,和運行(調用)有關。api
這種方式調用,函數運行時內部的this指向全局對象window。數組
這種方式調用,函數運行時內部的this指向宿主對象。 (dom中事件綁定的函數,就是這種調用方式,因此this指向對應的dom對象)緩存
這種方式調用,函數運行時內部的this指向新建立的實例對象。閉包
說的是變量的查找規則,特色是變量查找與函數定義有關,與調用無關app
function fn() { console.log(a); // 報錯,本身找不到,去定義fn的全局找,因此這裏和fn的定義有關,與fn的調用無關。
} (function() { var a = 10; fn(); })();
function getCounter() { var total = 0; return { add: function() { total++; }, get: function() { return total; } }; }; var counter = getCounter(); counter.add(); counter.get(); var counter2 = getCounter(); counter2.add(); counter2.get();
var cache = (function() { var cache = {}; return { set: function(key, val) { cache[key] = val; }, get: function(key) { return cache[key]; } }; }()); cache.set('張銳', '中國人'); cache.get('張銳');
var arr = ['第一句話', '第二句話', '第三句話']; for(var i = 0, len = arr.length; i < len; i++) { setTimeout(function(i) { return function() { console.log(arr[i]); } }(i), 1000 * i + 1000); }
一、變量聲明提高:檢測到變量聲明那就率先進行聲明dom
二、函數聲明提高:檢測到函數聲明也率先進行聲明函數
var a; //屬於變量聲明。
b = 10;// 不屬於變量聲明。
var a, b, c = 20, d = 30; //a,b,c,d所有屬於聲明。
var a = b = 10; //其中a屬於變量聲明,b不屬於。
console.log(a); // 預解析後值保留一個變量a,值爲undefined
var a = 1; var a = 2;
console.log(test); // 預解析後test爲打印2的函數
function test(){ console.log(1) } function test(){ console.log(2) }
console.log(test); // 預解析後test值爲函數
var test = 10; function test(){} var test = 20;
形參定義與賦值優先於變量與函數聲明。學習
(function(a) { console.log(a); // a函數
var a = 200; function a(){} console.log(a); // 200
}(100));
// 函數fnName的名字在外面沒法訪問,可是能夠在函數內訪問,
// 至關於本身的一個局部變量,值爲本身的引用。
var fn = function fnName(){ console.log(fnName); // 裏面能夠訪問
}; console.log(fnName); // 外面訪問報錯
函數名() || (function(){}()) ==> windowthis
對象.方法名() || 對象方法名 || 祖對象.父對象.子對象.方法名() ==> 宿主對象spa
new 構造函數() || new 對象.構造函數() ==> new出來的新實例
// 給僞數組添加數據
var obj = {}; Array.protype.push.call(obj, '要添加的第一個值', '要添加的第二個值') // 經過僞數組獲取對應的真數據(獲取後原僞數組不會被改變,只是獲得了新數組)
var argArr = [].slice.call(arguments);
var arr = []; Object.prototype.toString.call(new Date).slice(8, -1)
function Parent(name, age) { this.name = name; this.age = age; } function Son() { Parent.apply(this, arguments); } var p = new Son('火星人', 999); // apply拆分數組或僞數組值依次傳遞給函數
var arr = [1, 10, 20, 40]; Math.max.apply(null, arr)
全局模式