典型例子

1.变量声明作用域

(function(){
    var a = b = 5;
})();
alert(b); //5

b默认是全局变量,没有显示的用window.b 引用,如果采用严格模式 'use strict' 

(function(){
    'use strict'
   var a = window.b = 5;
})();

注意这里:alert(a); // error 因为a是函数局部变量 访问不到。

 

2. 原型的理解

对String 原型增加一个函数,使用方式:str.repeatity(2); // strstr;

if(typeof String.prototype.repeatify != "function")
    {
        String.prototype.repeatify = function(times){
            var str="";
            for(var i=0;i<3;i++){
                str += this;
            }
            return str;
        }
    }

或者

String.prototype.repeatify = String.prototype.repeatify || function(times){
            var str="";
            for(var i=0;i<3;i++){
                str += this;
            }
            return str;
        

先判断原型中是否存在repeatity 函数,防止每次都重新设置函数

注意this 是指当前调用的string对象。

3. 变量声明问题

(function test(){
    // alert(a);   //undefined
    // alert(foo()); //2

    var a = 1;
    function foo(){
        return 2;
    }
})();

第一个alert 时是undefind 因为a已经存在函数内,被声明但是没有被初始化,相当于

(function test(){
    var a;
    function foo(){
        return 2;
    };
    alert(a); //undefinde
    a = 1;
})();

 

4. 作用域问题

var name = "Jack";
var obj = {
    name : "Obj_Jack",
    prop:{
        name:'prop_Jack',
        getName : function(){
            return this.name;
        }
    }
}
// alert(obj.prop.getName()); //prop_Jack
var t = obj.prop.getName; //t是全局函数
// alert(t()); //Jack
// alert(t.call(obj)); // Obj_Jack (重新设置作用域)

第一个alert obj引用属性prop,然后prop引用在调用getName 方法 此时的作用域在prop引用内。

第二个alert 变量t是全局变量,引用指向函数getName,此时的作用域是全局的。

第三个alert t全局调用call 方法第一个参数是设置作用域,此时的作用域改为obj引用内。

posted @ 2014-12-08 12:01  lcw5945  阅读(130)  评论(0编辑  收藏  举报