1、With语句
with语句是运行缓慢的代码,尤其是在设置了属性值时。大多数情况下。如果可能,最好避免使用它。
with用法
当你有一个对象的多个属性或者方法需要操作时,就可以使用with
比如
<body>
test
<script type="text/javascript">
var o=document.createElement("div");
with(o){
style.cursor="pointer";
style.zIndex="100";
innerHTML="aaaa";
}
document.body.appendChild(o);
</script>
</body>
上面的代码相当于
<body>
test
<script type="text/javascript">
var o=document.createElement("div");
o.style.cursor="pointer";
o.style.zIndex="100";
o.innerHTML="aaaa";
document.body.appendChild(o);
</script>
</body>
所以with 用于简化 代码 操作。
2、返回值:
如果函数无明确返回值,或者调用了没有参数的return语句,那么它真正的返回值是undefined。
3、Function:
尽管可用Function构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢的多。不过,所有的函数都应看作是Function类的实例。
var function_name = new Function(argument1,argument2,..,argumentN, function_body);
每一个argument都是一个参数,最后一个参数是函数主题(要执行的代码),这些参数必须是字符串。
Javascript中函数就是对象。对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接。调用一个函数将暂停当前函数的执行传递控制权和参数给新函数。除了声明时定义的形式参数,每个函数都会接收两个附加参数:this 和 arguments。在Javascript中一共提供四种调用模式:方法调用模式、函数调用模式、构造器调用模式、apply调用模式。这些模式在如何初始化关键参数this上存在差异。
3.1 方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。
var myObject = {
value:0,
increment:function(inc){
this.value += typeof inc === 'number' ? inc : 1;
}
}
myObject.increment();
document.writeln(myObject.value); //1
myObject.increment(2);
document.writeln(myObject.value); //3
方法可以使用this去访问对象,所以它能从对象中取值或修改对象。this到对象的绑定发生在调用的时候。(“超级”延迟绑定可以是函数对this高度复用)。
通过this可取的他们所属对象的上下文的方法为
公共方法。
3.2 函数调用模式
当一个函数并非一个对象的属性时,那么它被当作一个函数来调用:
var sum = add(3,4); //sum 的值为7
当函数以此模式调用时,this被绑定到全局对象。这是一个语言设计上的一个错误,如果设计正确,当内部函数被调用时,this应该仍然被绑定到外部函数的this变量。这个设计错误的后果是方法不能利用内部函数来帮助工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。
解决办法:如果该方法定义一个变量并赋值为this,那么内部函数就可以通过那个变量访问到this。按照约定,我们给那个变量命名为that。
myObject.doubleFunction = function(){
var that = this;
var helper = function(){
that.value = that.value * 2;
};
helper();
}
//以方法的形式调用 doubleFunction。
myObject.doubleFunction();
document.writeln(myObject.value); //6
3.3 构造器调用模式
Javascript 是一门基于原型继承的语言。这意味着对象可以直接从其他对象继承属性。如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到函数的prototype成员的新对象,同时this将会被绑定到那个新对象上。
//创建一个名为Quo的构造器函数。他构造一个带有status属性的对象。
var Quo = function(string){
this.status = string;
};
//给Quo的所有实例提供一个名为get_status的公共方法。
Quo.prototype.get_status = function(){
return this.status;
}
//构建一个Quo实例
var myQuo = new Quo("confused");
document.writeln(myQuo.get_status());
结合new前缀调用的函数成为构造器函数,按照约定,它们保存在以大写格式命名的变量里。如果调用函数没有加new,可能会发生非常糟糕的事情。不推荐使用这种形式的构造器函数。
3.4 Apply调用模式(The Apply Invocation Pattern)
简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。
call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。
apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,参数可以是数组或者arguments 对象。
这两个方法通常被用来类的继承和回调函数:
function Person(name,age){
this.name = name;
this.age=age;
this.alertName = function(){
alert(this.name);
}
this.alertAge = function(){
alert(this.age);
}
}
function webDever(name,age,sex){
Person.call(this,name,age);
this.sex=sex;
this.alertSex = function(){
alert(this.sex);
}
}
var test= new webDever("愚人码头",28,"男");
test.alertName();//愚人码头
test.alertAge();//28
test.alertSex();//男
4、闭包(closure)
各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包可以用在许多地方。它的最大用处有两个,
一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
javascript闭包的具体讲解:http://blog.csdn.net/spring19840513/article/details/7336066
5、对象基础
废除对象的所有引用时要当心。如果一个对象有两个或更多引用,则要正确废除该对象,必须将其所有引用都设置为null。
6、返回(Return)
如果函数以在前面加上new前缀的方式调用,且返回不是一个对象,则返回this(该新对象)。
7、给类型增加方法
Javascript允许给语言的基本类型增加方法。通过prototype属性添加。举例来说,我们可以通过Function.prototype增加方法使得该方法对所有函数可用:
Function.prototype.method = function(name, func){
this.prorotype[name] = func;
return this;
}
调用的时候就不需要输入prototype属性,因为Javascript
原型继承的动态本质,新的方法立即被赋予到所有的值(对象实例)上,哪怕值(对象实例)是方法被创建之前就创建好的。