美文网首页
JavaScript Tips - Vol.2 引用类型

JavaScript Tips - Vol.2 引用类型

作者: 张羽辰 | 来源:发表于2018-06-16 16:23 被阅读0次

ECMAScript 中,引用类型只是一种数据结构,用于数据与功能的组装,常被称为类,但并不妥当。虽然引用类型与类看起来相似,但它们并不是相同的概念。

每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。

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

console.log(sum(10, 10));        //20

var anotherSum = sum;
console.log(anotherSum(10, 10)); //20

sum = null;
console.log(anotherSum(10, 10)); //20

函数名有点类似于指针,按照变量的方式参考,就变成这样,所以 ECMAScript 并没有重载这一说法,因为被覆盖了。

function addSomeNumber(num, anotherNum){
    return num + 100 + anotherNum;
}
function addSomeNumber(num) {
    return num + 200;
}
console.log(addSomeNumber(100)); //300

而实际上,解析器在向执行环 境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行 9 任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。请看下面的例子。

console.log(sum(10,10));
function sum(num1, num2){
    return num1 + num2;
}

// error
console.log(sum(10,10));
var sum = function(num1, num2){
    return num1 + num2;
};

因为解释器会在执行时,找不到 sum 对应的函数引用。

函数可以传递,并且也可以被返回(废话)。

函数 arguments 是一个挺有意思的东西,使用 arguments.callee 会避免耦合问题。

function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1)
        // return num * factorial(num - 1)
    }
}

var trueFactorial = factorial;
factorial = function(){
    return 0;
};
console.log(trueFactorial(5));     //120
console.log(factorial(5));         //0

函数内部的另一个特殊对象是 this,其行为与 Java 和 C#中的 this 大致类似。换句话说,this 引用的是函数据以执行的环境对象——或者也可以说是 this 值(当在网页的全局作用域中调用函数时, this 对象引用的就是 window)。

每个函数都包含两个非继承而来的方法:apply()和 call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。

apply() 与 call() 真正的意义是扩充函数的作用域。参考下面这个有意思的例子:

window.color = "red";

var o = { color: "blue" };
function sayColor(){
    var color = "black";
    console.log(color);
}
sayColor(); // red
sayColor.call(this); // red
sayColor.call(o); // blue

o = null;
sayColor.call(o); // red
function sayColor(){
    var color = "black";
    console.log(this.color);
    // this 引用的是函数据以执行的环境对象
    // same as before
}

function sayColor(){
    var color = "black";
    console.log(color);
    // all black
}

window.color = "red";
var o = { color: "blue" };
function sayColor(){
    console.log(this.color);
}

var myColor = sayColor.bind(o);

myColor();

使用 .bind() 当你希望获得一个函数,并且可以在合适的时机调用(例如 lazy load 等场景),或者可以作为事件,当你使用 .call().apply() 当你想立刻调用该函数,并且修改其上下文。

相关文章

  • JavaScript Tips - Vol.2 引用类型

    ECMAScript 中,引用类型只是一种数据结构,用于数据与功能的组装,常被称为类,但并不妥当。虽然引用类型与类...

  • JavaScript对象总结(面向对象、原型链、继承)

    JavaScript数据类型分为基本类型和引用类型,对象则是某个特定引用类型(如原生引用类型:Object、Arr...

  • JS面试复习笔记

    JavaScript复习 变量类型值类型typeof :值[开新空间]/引用[引用堆空间]/函数引用类型对象深拷贝...

  • 前端知识重点复习(1)

    第一章 JavaScript基础 第一节 引用传递 什么是引用传递 JavaScript数据类型分为基本类型和引用...

  • javascript引用类型

    主要是javascript第五章,感觉好长,内容挺多,挺杂,挑重点纪录一下。javascript包括:基本类型和引...

  • JavaScript 引用类型

    一、 RegExp 类型 JavaScript 通过 RegExp 类型来支持正则表达式。使用类似与 Perl 的...

  • JavaScript引用类型

    Object类型 创建方式: 1.使用new操作符后跟构造函数 var p = new Object(); 2.使...

  • JavaScript 引用类型

    所谓引用类型,在ECMAScript中表示一种数据结构,其中有一些数据和方法,在其他语言中大多被称为类,但是在这里...

  • 第四章——变量、作用域、内存问题

    基本类型和引用类型的值 javascript引用数据类型是保存在堆内存中的对象,JavaScript不允许直接访问...

  • 基本类型值和引用类型值

    JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。 *引用类型包括: 基本类型值和引用类型...

网友评论

      本文标题:JavaScript Tips - Vol.2 引用类型

      本文链接:https://www.haomeiwen.com/subject/mzebeftx.html