JavaScript 语言精粹读书笔记(第四章)

本文详细介绍了JavaScript中函数的四种调用模式:方法调用、函数调用、构造器调用及apply调用,并深入探讨了闭包的概念及其应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的四种调用模式

方法调用

当函数作为一个对象的属性时,被称为方法,当方法被调用时,this被绑定到该对象。方法可以通过this访问对象,this到对象的绑定发生在调用时。 函数调用 当一个函数并非一个对象的属性时,被作为函数调用。这时,this被绑定到全局对象。因此,内部函数无法通过this访问外部对象。 可以通过var that =this;在通过that访问外部对象。

构造器调用

使用new来调用,将会创建一新对象,并且将其链接到该函数的prototype上,同时this会绑定在新对象上。

Apply调用

可以使用函数提供的apply方法进行对函数的调用,这种方式可以将this绑定任意对象上。

闭包

函数访问被创建时所处的上下文,通过这种方式可以持久化局部变量,可以实现对变量访问的控制。 如下代码实现一个简单的闭包,使status常驻内存,并且保证只能通过getStatus获取值以及inc方法修改该值。

var o= function (status) {
    return{
        getStatus:function(){
            return status;
        },
        inc:function(){
            return ++status;
        }
    };
}(1)


下面的例子可以很好的理解内部函数能访问外部函数的实际变量而不是副本。

var a={};
var b={};
var c={};
var arr=[a,b,c];
var fun= function (arr) {
    var i;
    for(i=0;i<arr.length;i++){
        arr[i].fun=function(i){
            return function(){
                alert(i);
            };
        }(i);
    }
}
fun(arr);
arr[0].fun();
arr[1].fun();
arr[2].fun();

下面的例子演示如何利用闭包产生安全的对象
var marker= function () {
    var prefix='';
    var seq=0;
    return {
        setPrefix: function (p) {
            prefix=String(p);
        },
        setSeq: function (s) {
            seq=s;
        },
        gen: function () {
            var result=prefix+seq;
            seq+=1;
            return result;
        }
    }
}();

marker.setPrefix('p');
marker.setSeq(100);
console.log(marker.gen());

上面例子用来生成唯一的序列,只能通过setPrefix设置前缀,setSeq设置序号以及gen方法生成序列。无法通过任何其他方式修改内部的prefix和seq的值。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值