转载请注明来源:http://blog.csdn.net/caoshiying?viewmode=contents。这篇文章针对的是有2年以上编程经验的朋友们参考的,作参考资料之用,不从基础讲起。

1.1.1. 函数字面量

函数字面量包括四个部分,第一部分是关键字,第二部分是函数名,把函数赋值给一个对象的时候可以省略函数名。第三部分是圆括号包括起来的一组参数,第四部分是函数的主体。

函数字面量可以出现在任何允许表达式出现的地方,也可以被定义在其它函数中。内部函数可以访问自己的参数和变量,也可以访问嵌套它的函数与变量。通过函数字面量创建的函数对象包含一个连到外部的上下文的连接。这被称为闭包。

JavaScript中函数就是对象。每个函数对象在创建时带有prototype和constructor属性。它既可以像普通对象一样使用,又可以调用它的函数。

调用一个函数将中断当前函数的执行。除函数声明定义的参数,每个函数都有两个附加的参数:this和arguments。this的值取决于调用模式。JavaScript函数一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。

函数调用符是跟在任何产生一个函数值的表达式之后的一对圆括号。圆括号内可以包含0个或者1个或者用逗号隔开的多个参数。参数不会进行类型检查。

1.1.2. 匿名闭包

匿名闭包是让一切成为可能的基础,而这也是JavaScript最好的特性,我们来创建一个最简单的闭包函数,函数内部的代码一直存在于闭包内,在整个运行周期内,该闭包都保证了内部的代码处于私有状态。范式:

(function(){
    . . .
    . . .
})();


或者

(function(){
    . . .
    . . .
}());


临时使用的不属于任何类型的函数和变量建议都放进匿名闭包中。

1.1.3. 方法调用模式

当一个函数被保存为对象的一个属性时,我们称之为方法。this是调用函数的对象。示例工程:J431。

    var student1={
        value:0,increment:function(inc){
            this.value+=typeofinc == "number" ? inc :1;
        }
    };
    student1.increment();
    document.writeln(student1.value);
    document.write("<br/>");
    student1.increment(10);
    document.write(student1.value);


1.1.4. 函数调用模式

当函数不是一个对象的属性时,我们称之为函数。这个调用模式下this的值是全局对象,内部函数无法通过this访问嵌套它的函数对象。有一个解决方法是在调用内部函数之前在函数对象中增加一个成员记录this,然后内部函数用记录this的成员变量访问this。示例工程:J432。

    var student1={
        name:"李婷",getName:function () {
            functionwriteinformation() {
                console.log(this);
                document.write(typeofthis.name+","+this.name);
                document.write("<br/>");
            }
            writeinformation();
        }
    };
    var student2={
        name:"李婷",getName:function() {
            varthat=this;
            functionwriteinformation() {
                console.log(that);
                document.write(typeofthat.name+","+that.name);
                document.write("<br/>");
            }
            writeinformation();
        }
    };
    student1.getName();
    student2.getName();
    document.write("---------------------分隔线-----------------------<br/>");
    varStudentClass=function () {
        this.name="李婷";
        var that=this;
        functiongetName1() {
            console.log(this);
            document.write(typeofthis.name+","+this.name);
            document.write("<br/>");
        }
        functiongetName2() {
            console.log(that);
            document.write(typeofthat.name+","+that.name);
            document.write("<br/>");
        }
        this.getName=function(){
            getName1();
            getName2();
        }
    }
    var student=newStudentClass();
    student.getName();


1.1.5. 构造器调用模式

这个模式的关键在于用函数声明类型后用类型的prototype的属性定义函数。示例工程:J433。

    varStudentClass=function (s) {
        this.status=s;
    }
    StudentClass.prototype.getStatus=function() {
        returnthis.status;
    }
    var student=new StudentClass("很好");
    document.write(student.getStatus());


1.1.6. Apply调用模式

这种模式的关键在于调用不属于任何对象的函数是不直接调用函数本身,而是调用函数的apply成员函数。示例工程:J434。

    var student1={
        name:"李婷",age:22,getDescription:function(){
            varparams=[this.name,this.age];
            functionwriteDescription(name,age) {
                vars="我叫"+name+",我今年"+age+"岁了。";
                console.log(this);
                document.write(s);
            }
            writeDescription.apply(null,params);
        }
    };
    student1.getDescription();


1.1.7. 私有成员

闭包的一个重要作用是保护私有成员不被外部随意更改,增加程序的可控性与可靠性与可阅读性。全局变量与全局函数JavaScript程序的一大弊端。与Java相比,JavaScript可以借用生命周期模拟出私有成员变量与私有成员方法,方法是在声明它们的时候不与this绑定。对象的公有方法可以调用私有方法。示例程序:J410。

    var fade=function(node) {
        var level=1;
        var step=function () {
            varhex=level.toString(16);
            node.style.backgroundColor="#FFFF"+hex+hex;
            if(level<15){
                level+=1;
                setTimeout(step,200);
            }
        }
        setTimeout(step,200);
    };
    fade(document.body);
    varstudent=function () {
        var value=0;
        return {
            increment:function(inc){
                value+=typeofinc == "number" ? inc : 1;
            },getValue:function() {
                returnvalue;
            },name:"李婷"
        };
    }();
    student.increment();
    document.write(student.getValue());
    document.write("<br/>");
    student.increment(10);
    document.write(student.getValue());
    document.write("<br/>");
    document.write(student.name);


1.1.8. 回调(Callbacks)

回调的思想是把函数作为参数传递给另外一个函数,另外一个函数通过回调可以把它的参数传递给当前函数,这个函数在访问当前上下文的同时可以访问另外一个函数发回的值。典型的回调是setTimeout。

1.1.9. 模块(Module)

模块是一个提供接口却隐藏状态与实现的函数或者对象。可以使用函数或者闭包构造模块。通过模块可以降低JavaScript全局变量带来的负面影响。示例工程:J412。

    String.prototype.deentityify=function() {
       var entity={
           quot:"\"",lt:"<",gt:">"
       };
       var that=this;
       return function() {
           returnthat.replace(/&([^&;]+);/g,function (a,b) {
               varr=entity[b];
               returntypeof r === 'string' ? r : a;
           });
       }();
    };
    document.write("<">".deentityify());


1.1.10.级联(Cascade)

返回值为this的方法可以连续调用。示例工程:J413。

    varStudentClass=function () {
        this.name="李婷";
        this.age=22;
        this.mark=100;
 
        this.writeName=function(){
            document.write(this.name);
            document.write("<br/>");
            returnthis;
        };
 
        this.writeAge=function(){
            document.write(this.age.toString());
            document.write("<br/>");
            returnthis;
        };
 
        this.setName=function(name){
            this.name=name;
            returnthis;
        }
 
        this.setAge=function(age){
            this.age=age;
            returnthis;
        }
    };
 
    var student=newStudentClass();
    student.
        writeName().
        writeAge().
        setName("你好").
        setAge(21).
        writeName().
        writeAge();


1.1.11.套用(Curry)

套用指的是一个函数返回自己的时候,接收返回值的对象保存了原来的函数的状态。它的调用可以基于原来的函数的状态继续执行。示例工程:J414。

    var add=function (){
        var value=0;
        var func=null;
        vargetValue=function (inc) {
            value+=typeofinc == "number" ? inc : 1;
            document.write(value.toString()+"<br/>");
            returnfunc;
        }
        func=getValue;
        returngetValue;
    }
    varfunc1=add(10);//此时没有运算
    curry1=func1(10);
    curry2=curry1(10);
    console.log(func1);
    console.log(curry1);
    console.log(curry2);


1.1.12.记忆(Memoization)

函数可以用对象去记住先前的操作结果,从而避免无谓的运算。这种优化被称为记忆。示例工程:J415。

    varfibonacci=function (n) {
        return n < 2? n : fibonacci(n - 1) + fibonacci(n - 2);
    };
    for(vari=0;i<=10;i++){
        document.write(fibonacci(i).toString()+"<br/>");
    }

AngularJS系列之JavaScript闭包的更多相关文章

  1. ios – 仅在异步函数完成执行后运行代码

    所以,例如:如果问题是你不知道要调用什么函数,你可以配置你周围的函数/对象,这样有人可以给你一个函数,然后你在我上面说“调用函数”的地方调用你的函数.例如:

  2. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. ios – Swift中的UIView动画不起作用,错误的参数错误

    我正在尝试制作动画并使用下面的代码.我得到“无法使用类型’的参数列表调用’animateWithDuration'(FloatLiteralConvertible,延迟:FloatLiteralConvertible,选项:UIViewAnimationoptions,动画:()–>()–>$T4,完成:(Bool)–>(Bool)–>$T5)’“错误.这意味着我使用了错误的参数.我错了.请

  4. iOS 7,用于断开调用的私有API CTCallDisconnect不起作用

    谢谢!

  5. ios – 监控CBPeripheral状态变化

    我在CoreBluetooth库中找不到任何暴露的东西,我想在CBperipheralstate发生变化时调用一个函数.现在我只有一个switch语句来检查外设状态,但它总是只返回连接或断开连接.我如何进入连接/断开连接的情况?

  6. ios – 使用捕获列表中的无主内容导致崩溃,即使块本身也不会执行

    欣赏有关如何调试此内容的任何提示或有关导致崩溃的原因的解释……

  7. ios – Swift传递封闭与Params

    目前我传递一个闭包作为一个对象的属性,该对象不接受参数并且没有返回值,如下所示:到目前为止,这工作得很好.我希望能够在设置此闭包时传入一个参数,以便在MyClass的实例中使用.我正在寻找下面的SOMETHING,虽然我确定语法不正确:我如何将参数传递给可以在MyClass中使用的闭包–即可以在属性本身的didSet部分内使用的值,如第二个示例中所示?

  8. ios – Xcode游乐场不执行功能

    我创建了一个新的游乐场,我添加了简单的功能,但该功能从未被调用过:你们中的任何人都知道为什么函数没有被调用?我真的很感谢你的帮助解决方法因为你没有调用该函数.只需称呼它:

  9. ios – 来自UIAlertController的self.navigationController?.popViewControllerAnimated

    我是新手,但我想我已经掌握了它.这让我的进步很难过.我想要做的是当我们无法找到他的查询的相关数据时向用户抛出错误消息,然后继续将他带回到之前的ViewController.但是,我在这方面遇到了麻烦.在我添加操作的行上,我收到以下错误:’UIViewController?’不是Void的子类型我该怎么做呢?

  10. ios – Swift中没有输入参数的通用函数?

    我有一个通用的Swift函数,如下所示:编译器没有错误,但我不知道如何调用此函数.我试过了:但它不起作用.如何在没有输入参数的情况下在Swift中调用Generic函数?解决方法你需要通过一些调用上下文告诉Swift返回类型是什么:注意,在后一种情况下,只有当someCall采用类似于Any的模糊类型作为其参数时,才需要这样做.相反,someCall被指定为[Int]作为参数,函数本身提供上下文,你可以只写someCall事实上,有时可以非常推断出背景!

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部