美文网首页
JavaScript基础二:Functions

JavaScript基础二:Functions

作者: 北雁南飞_8854 | 来源:发表于2020-11-15 12:07 被阅读0次

深入理解Functions

在ECMAScript 5里,function内部有两个特殊的objects:arguments和this。在ECMAScript 6里,又引入了new.target属性。

arguments对象

this对象

在标准函数和箭头函数中,this的指向是不同的。
在标准函数中,this指向函数被绑定的对象(context object)。
在箭头函数中,this指向函数表达式被定义的上下文(context)。

identity = 'The Window';
let object = {
    identity: 'My Object',
    getIdentity () {
        return this.identity;
    }
};

const result1 = object.getIdentity();
const result2 = (object.getIdentity)();
console.log(result1); //My Object
console.log(result2); //My Object

const result3 = (object.getIdentity = object.getIdentity)()
console.log(result3); //The Window

caller属性

new.target属性

可以通过Function的constructor来实例一个新对象,也可以作为普通函数来调用。
new.target用来判断是否使用了new关键字来调用函数。

function King() {
   if (!new.target) {
       throw 'King must be instantiated using "new"'
}
   console.log('King instantiated using "new"';
}
new King(); // King instantiated using "new"
King(); // Error: King must be instantiated using "new"

length属性

用来表示该函数期望接收的有名参数(named arguments)的个数。
举例:

function sayName(name) {
    console.log(name);
}

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

function sayHi() {
    console.log("hi");
}
console.log(sayName.length); // 1
console.log(sum.length); // 2
console.log(sayHi.length); // 0

prototype属性

作用域链

当一个function被调用时,就会为他创建一个执行上下文(execution context)和作用域链(scope chain)。其中作用域链中的第一级是该function的活跃对象(activation object),它包含了arguments和所有的有名参数(named arguments);第二级是外部函数的activation object,以此类推,最后一级是全局执行上下文的 (global execution context)的variable object。
作用域链本质上是指向variable objects的指针列表。

function createComparisonFunction(propertyName) {
    return function(object1, object2) {
        let value1 = object1[propertyName];
        let value2 = object2[propertyName];
        if (value1 < value2) {
            return -1;Closures ❘ 377
        } else if (value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}
let compare = createComparisonFunction('name');
let result = compare({ name: 'Nicholas' }, { name: 'Matt' });

当createComparisonFunction函数执行完毕后,它的执行上下文的作用域链(scope chain )会被销毁,但是它的activation object仍会保留在内存中、直到它内部的匿名函数被销毁掉。

// create function
let compareNames = createComparisonFunction('name');
// call function
let result = compareNames({ name: 'Nicholas' }, { name: 'Matt' });
// dereference function - memory can now be reclaimed
compareNames = null;

相关文章

网友评论

      本文标题:JavaScript基础二:Functions

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