1、ECMAScript不存在块级作用域。
如图,i仍然可以访问到。
2、ECMAScript没有函数签名,所以没有重载。
3、
4、可以给对象动态添加属性,不能给基本类型的值添加属性。
5、函数的参数只能按值传递
6、变量的值是对象或者null,则typeof操作符会返回object。
7、
子执行环境向上搜索作用域链,即内部环境可以通过作用域链访问外部环境。反之不可以。
8、延长作用域链的情况:
9、javascript没有块级作用域
10、访问属性一般推荐使用点表示法
11、
12、concat()
slice()
splice()
13、
14、
使用不带圆括号的函数名是访问函数指针。
15、
concat()
slice()
substring()
substr()
16、所有代码执行之前,作用域就已经存在两个两个内置对象:Global和Math。web浏览器实现了承担global对象角色的window对象。
17、读取属性的特性 Object.getOwnPropertyDescriptor()
18、
19、
创建自定义类型的方法,定义引用类型的一种推荐模式:
组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["lucy","lily"];
}
Person.prototype= {
constructor: Person;
sayName:function(){
alert(this.name);
}
}
var person1 = new Person("WeiHanying",23,"Software Engineer");
var person2 = new Person("WuQingfeng",34,"Singer");
person1.friends.push("XiaoBai");
alert(person1.friends);//lucy,lily,xiaobai
alert(person2.friends);//lucy,lily
alert(person1.friends === person2.friends);//false
alert(person1.sayName===person2.sayName);//true
20、
动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
var friend = new Person("aa",22,"Software Engineer");
friend.sayName();
使用动态原型模式时,不能使用对象字面量重写原型。因为如果在已经创建了实例的情况下重写原型,会切断现有的实例和新原型之间的联系。
21、
寄生构造函数模式
function Person(name,age,job){
var o = new Object();
o.name = name;
o.age= age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var friend = new friend("Why",22,"Software Engineer");
friend.sayName();
稳妥构造函数模式
与寄生构造函数的区别:一是新创建对象的实例方法不引用this,二是不适用new 操作符调用构造函数
function Person(name,age,job){
var o = new Object();
//可以在这里定义私有变量和函数
o.sayName = function(){
alert(name);
};
return o;
}
22、
关于原型
23、
JavaScript中最常用的继承模式:
组合继承,它融合了原型链和构造函数的优点。
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
alert(this.age);
};
24、
寄生组合式继承--------------还需要进一步理解
25、如果闭包的作用域链中保存着一个html元素,那么就意味着该元素将无法被销毁
26、
JavaScript没有块级作用域
如图,在一般java等语言中,变量i只会在for循环语句块中有定义,循环结束i就销毁了。但是在JavaScript中,变量i是定义在整个函数的活动对象中的。因此从它有定义开始,就可以在函数内部随处访问,即使重复声明同一个变量,也阔以。不过可以用匿名函数来模仿块级作用域。
27、
私有作用域,示例:
(function(){
var now = new Date();
if(now.getMonth()==0 && now.getDate()==1){
alert("Happy New Year!");
}
})();
把上面这段代码放在全局作用域中,用来向用户祝贺新年快乐。变量now是匿名函数的局部变量,不必在全局作用域创建它。
28、
静态私有变量,注意MyObject声明为全局变量的关键之处。
29、
模块模式 和 增强的模块模式 -------还需要进一步深入理解。
30、递归函数应该始终使用arguments.callee来递归地调用自身,不要使用函数名——因为函数名可能发生变化。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
额 图片直接复制不可以,先在Evernote里存着了==