JavaScript函数、闭包、原型、面向对象

断言

单元测试框架的核心是断言方法,通常叫assert()。
该方法通常接收一个值–需要断言的值,以及一个表示该断言目的的描述。
如果该值执行的结果为true,断言就会通过;
否则,断言就会被认为是失败的。
通常用一个相应的通过(pass)/ 失败(fail)标记记录相关的信息;

function assert(value, desc) {
    let li = document.createElement('li');
    li.className = value ? 'pass' : 'fail';
    li.appendChild(document.createTextNode(desc));
    document.getElementById('results').appendChild(li);
}

// 断言函数
function assert(value, desc) {
    if (value) {
        console.log(`\033[32m ${desc} \033[0m`);    // 断言通过 绿色字体
    } else {
        console.log(`\033[31m ${desc} \033[0m`);    // 断言失败 红色字体
    }
}

函数

  • JavaScript是一门函数式语言

  • 在JavaScript中,函数是第一型对象。函数可以共处,可以视作为其他任意类型的对象。就像普通的JavaScript数据类型,,函数可以被任意变量进行引用,或声明成对象字面量,甚至可以将其作为函数参数进行传递。

  • 函数是第一型对象

    • 可以通过字面量进行创建。
    • 可以赋值给变量、数组或其他对象的属性。
    • 可以作为参数传递给函数。
    • 可以作为函数的返回值进行返回。
    • 可以拥有动态创建并赋值的属性。
  • 命名一个函数时,该名称在整个函数声明范围内是有效的。如果函数声明在顶层,window对象上的同名属性则会引用到该函数。

  • 所有的函数都有一个name属性,该属性保存的是该函数名称的字符串。匿名函数的name属性值为空。

  • 在JavaScript中,作用域是由function进行声明的,而不是代码块。声明的作用域创建于代码块,但不是终结于代码块(其他语言是终结于代码块的)

if (window) {
    var x = 123;
}
alert(x);

执行代码后,会弹出123,是因为JavaScript在大括号关闭处并没有终止其作用域。
  • 变量声明的作用域开始于声明的地方,结束于函数的结尾,与代码嵌套无关。

  • 命名函数的作用域是指声明该函数的整个函数范围,与代码嵌套无关;

  • 对于作用域声明,全局上下文就像一个包含页面所有代码的超大型函数。

  • 所有的函数调用都会传递两个隐式参数:argument和this

作为函数进行调用

如果一个数不是作为方法、构造器、或者通过apply()或call()进行调用的,则认为它是“作为函数”进行调用的。

function ninja() {};
ninja()

var samurai = function() {};
samurai()
  • 以这种方式调用时,函数的上下文是全局上下文---window对象。

作为方法进行调用

当一个函数被赋值给对象的一个属性,并使用引用该函数的这个属性进行调用时,那么函数就是作为该对象的一个方法进行调用的。

var 0 = {};
o.whatever = function() {};
o.whatever();
  • 将函数作为对象的一个方法进行调用时,该对象就变成了函数上下文,并且在函数内部可以以this参数的形式进行访问。

作为构造器进行调用

  • 将函数作为构造器进行调用,需要在函数调用前使用new关键字

版权声明:本文为webSciprt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/webSciprt/p/9592699.html