javascript 编程注意事项

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)

             javascript是一门函数式的面向对象编程语言,所以 函数可以拥有方法。 简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。 call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。 apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,参数可以是数组或者arguments 对象。 这两个方法通常被用来类的继承和回调函数:

简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。 
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 原型继承的动态本质,新的方法立即被赋予到所有的值(对象实例)上,哪怕值(对象实例)是方法被创建之前就创建好的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值