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)
全局模式