不一样的JavaScript(6)——函数调用

原创 2013年12月06日 10:43:20

1. 和C++/C#/Java类似,函数在被调用的时候用this指向函数的上下文对象。

1.1. 当函数没有与某个上下文对象绑定的时候,this指向全局的window对象。例如:

window.number = 10;

function printNumber() {
    console.log(this.number);
}

printNumber();

在上述代码中,由于this指向windows对象,因此输出为10。

1.2.当函数与某个对象绑定的时候,this指向该对象。例如:

function printNumber() {
    console.log(this.number);
}

var obj = {
    number: 8,
    print: printNumber
};

obj.print();

在上述代码中,函数printNumber通过对象obj调用,因此this指向了对象obj。代码的输出是8。

2. 函数还可以通过apply和call两种方式传入this指向的对象并调用。

2.1 通过apply调用函数时,第一个参数指定this指向的对象,第二个参数是一个参数数组,或者一个arguments对象。例如:

function addNumber(num1, num2) {
    console.log(this.number + num1 + num2);
}

var obj = {
    number: 8
};

function applyAdd1(num1, num2) {
    addNumber.apply(obj, [num1, num2]);
}

function applyAdd2(num1, num2) {
    addNumber.apply(obj, arguments);
}

applyAdd1(4, 5);
applyAdd2(4, 5);

在上述代码中,applyAdd1和applyAdd2都是通过apply调用函数addNumber,只是传入第二个参数的方法不一样。它们的功能也是一样的,都输出17。

2.2 如果用call调用函数,第一个参数传入this指向的对象,后面顺序传入其他参数。例如:

function addNumber(num1, num2) {
    console.log(this.number + num1 + num2);
}

var obj = {
    number: 8
};

function callAdd(num1, num2) {
    addNumber.call(obj, num1, num2);
}

callAdd(4, 5);

和前面一样,上述代码仍然输出17。

3. 我们还可以用bind函数显示地把函数和一个对象绑定起来,然后再在这个对象上调用该函数。例如:

function addNumber(num1, num2) {
    console.log(this.number + num1 + num2);
}

var obj = {
    number: 8
};

var addObjNumber = addNumber.bind(obj);
addObjNumber(4, 5);

由于函数addNumber通过bind函数显示地和对象obj绑定起来,再调用addNumber的时候,this指向的就指向了obj。因此,上述代码仍然输出17。

4. 可以在函数声明之后立即调用。利用这个特性,我们可以实现Singleton模式。下面是一段示例代码:

var singleton = function(data) {
    function Singleton() {
        this.data = data;
    };
    
    Singleton.prototype.func = function() {
        console.log(this.data);
    }
    
    return new Singleton(data);
    
}("Hello, singleton");

singleton.func(); // Hello, singleton



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

深究JavaScript——函数调用与this详解

this绑定时间  js的this总是指向一个对象,而这个对象是基于函数运行时动态绑定的,并非函数声明时绑定。函数调用方式 作为对象的方法调用 作为普通函数进行调用 作为构造器进行调用 通过apply...

不一样的Javascript(11)——函数与对象

1. 每个函数都是对象,因此函数上可以定义自己的属性。例如: test.counter = 0; function test() { console.log(test.counter); ...

数据结构基础(6)--递归和函数调用--汉诺塔问题C语言实现

C语言实现汉诺塔问题!

JavaScript四种函数调用方式

JavaScript四种函数调用方式

javascript的四种函数调用模式

这些模式影响到this的初始化参数每个函数除了接收正常的参数外,另有2个隐含参数:this, argumentsarguments,是函数接收的调用实参,与形参定义的参数个数无关arguments并不...

Javascript 的函数调用模式,有意思的表现

看《JavaScript:the good parts》一书中讲到Javascript方法调用的四种方式,其中比较nanli

javascript 逗号() 函数调用小结

逗号运算符还是参数分隔符. alert(5*2, 4*2); // 输出10.输入10,8两个参数,但alert仅用了第一个参数。 alert((5*2, 4*2)); // 返回8,仅输...

javascript的四种函数调用模式以及相应的this绑定

今天在重新看javascript高级程序设计中7.2.2中有一段代码让我费了点时间加上搜索才有点弄懂。 这个例子是用来说明对函数不同的调用会改变this。其中第三个调用(object.getNa...

javascript函数调用笔记

好吧,函数调用难道是我的死穴么?!! mark先,等解决了再补充 function output() { var str = document.getElementsByName("str"...

JavaScript函数调用及嵌套

函数调用 函数的调用和C中差不多,但形式可能有点不同。JavaScript的函数调用形式为:(函数)(参数列表)或者函数名(参数列表)。后者和C是一样的,但前者和C是迥然不同的,因为C中函数声明...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)