资讯专栏INFORMATION COLUMN

JavaScript函数表达式——“函数模仿块级作用域及函数的私有变量”的注意要点

archieyang / 2498人阅读

摘要:模仿块级作用域在块级语句中定义的变量,实际上是包含函数中而非语句中创建的。避免对全局作用域产生不良影响这种方式可以通过创建私有作用域,避免对全局作用域产生不良影响。一般包括函数的参数局部变量和内部定义的其他函数。

模仿块级作用域

在块级语句中定义的变量,实际上是包含函数中而非语句中创建的。如:

function outputNumbers(x){
    for (var i = 0; i < x; i ++){
        console.log(i);
    }
    var i; //即使重新声明了变量仍然不起作用
    console.log(i); //123
}
outputNumbers(4); //4
()()方法模仿块级作用域

通常用块级作用域(私有作用域)的匿名函数的语法来解决这个问题:

(function(){
    //这里是块级作用域
})();

无论什么地方,只要临时需要一些变量,就可以使用私有作用域,如:

function outputNumbers(x){
    (function(){
        for (var i = 0; i < x; i ++){
            console.log(i);
        }
    })()
}
outputNumbers(4); //0123

又如:

function outputNumbers(x){
    (function(){
        for (var i = 0; i < x; i ++){
            console.log(i);
        }
    })()
    var i;
    console.log(i);  //undefined
}
outputNumbers(4);

这样一来,变量i 只能在循环中使用,使用后即被销毁。实际上他也属于闭包。

避免对全局作用域产生不良影响

这种方式可以通过创建私有作用域,避免对全局作用域产生不良影响。

var num = 100;
(function(){
    if (num > 10){
        console.log("greater than 10");
    }
})();

(function(){
    if (num > 10){
        console.log("greater than 10");
    }
})();
//两者完全一样,相互独立,互不影响
私有变量

在js 中,任何在函数中定义的变量,都可以认为是私有变量。一般包括函数的参数、局部变量和内部定义的其他函数。如:

function add(num1,num2){
    var sum = num1 + num2;
    return sum;
}

其中这个函数的内部就有3个私有变量:num1、num2 和sum。

另外我们把有权访问私有变量和私有函数的公有方法称为特权方法。如:

function MyObject(){
    var privateVariable = 10;
    function privateFunction(){
        return false;
    }
    this.publicMethod = function(){
        privateVariable ++;
        return privateFunction();
    };
}    
var x = new MyObject();
console.log(x.publicMethod()) ;//false

利用私有和特权成员,可以隐藏那些不应该被直接修改的数据。如:

function Person(name){
    this.getName = function(){
        return name;
    };
    this.setName = function(setName){
        name = setName;
    };
}

var person = new Person("Oliver");
console.log(person.getName());
person.setName("Oli"); //Oliver
console.log(person.getName()); //Oli
静态私有变量

私有作用域中定义私有变量和函数,同样也可以创建特权方法,如:

(function(){
    var privateValue = 10;
    function privateFunction(){
        return false;
    }
    
    MyObject = function(){}; //没有var 属于全局变量,严格模式下会报错
    
    MyObject.prototype.publicMethod = function(){
        privateValue ++;
        return privateFunction();
    };
})();

var instance = new MyObject();
console.log(instance.publicMethod()); //false
模块模式

针对单例创建私有变量和特权方法。单例就是只有一个实例的对象。如:

var singleton = {
    name: value,
    method: function(){
        
    }
};

添加私有变量以及特权方法:

var singleton = function(){
    var privateVariable = 10;
    
    function privateFunction(){
        return false;
    }
    
    return {
        publicProperty: true,
        publicMethod: function(){
            privateVariable++;
            privateFunction();
        }
    };
}();

简化:

var a = function(){
    var x;
    function y(){};
    return {
        z1,
        z2
    };
}();
增强的模块模式

这种模式适合那些单例必须是某种类型的实例。如:

var singleton = function(){
    var privateVariable = 10;
    
    function privateFunction(){
        return false;
    }
    
    var object = new CustomType();
    
    object.publicProperty = true;
    
    object.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    };
    return object;
}();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78214.html

相关文章

  • JavaScript引用类型——“单体内置对象”注意要点

    摘要:单体内置对象单体内置对象就是开发人员不必显式地实例化内置对象,因为他们已经实例化了。前面的章节讨论过了大多数内置对象,还定义了两个单体内置对象和。 单体内置对象 单体内置对象就是开发人员不必显式地实例化内置对象,因为他们已经实例化了。前面的章节讨论过了大多数内置对象,ECMA-262 还定义了两个单体内置对象:Global 和Math。 Global 对象 所有在全局作用域中定义的属性...

    xushaojieaaa 评论0 收藏0
  • JavaScript函数达式——“函数递归和闭包”注意要点

    摘要:如调用函数声明函数不会报错使用函数表达式则不可以报错创建函数的两种方式,一个是函数声明如第一种方式一个是函数表达式如第二种方式。第二种函数创建方式创建的函数叫匿名函数或拉姆达函数,因为关键字后面没有标识符。 函数表达式的基本概念 name属性和函数提升 首先,name属性,通过这个属性可以访问到给函数指定的名字。(非标准的属性)如: function People(){}; cons...

    winterdawn 评论0 收藏0
  • JavaScript引用类型——“Function类型”注意要点

    摘要:类型每个函数都是类型的实例。如以上代码可行,是因为在代码开始值钱,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中去。也可同时使用函数声明和函数表达式,但在浏览器中会出错。 Function 类型 每个函数都是Function 类型的实例。函数名实际上就是一个指向函数对象的指针,不会与某个函数绑定。 函数声明方式创建Function,语法如下: functi...

    fantix 评论0 收藏0
  • JavaScript引用类型——“RegExp类型”注意要点

    摘要:类型通过类型来支持正则表达式。如由于构造函数的模式参数是字符串,所以在某些情况下要对字符串进行双重转义。而第二个循环使用构造函数在每次循环冲创建正则表达式。如另外,还有个用于存储捕获组的构造函数属性。 EegExp 类型 ECMAScript 通过RegExp 类型来支持正则表达式。语法如下: var expression = / pattern / flags; 每个正则表达式都可...

    mochixuan 评论0 收藏0
  • 深入理解javascript原型和闭包

    摘要:深入理解原型和闭包王福朋博客园深入理解原型和闭包一切都是对象原文链接本文要点一切引用类型都是对象,对象是属性的集合。每个对象都有一个,可称为隐式原型。另外注意,构造函数的函数名第一个字母大写规则约定。 深入理解javascript原型和闭包 王福朋 - 博客园 —— 《 深入理解javascript原型和闭包》 1. 一切都是对象 原文链接:http://www.cnblogs.com...

    jemygraw 评论0 收藏0

发表评论

0条评论

archieyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<