你真的晓得JS吗?

你真的晓得JavaScript吗

    JavaScript是一门新鲜的言语,要真正控制并不轻易。空话不多说,来一个疾速测试,5道问题,看看你对JavaScript是不是真正控制。预备好了吗?最先咯?

问题

No.1

if (!("a" in window)) {
    var a = 1;
}

console.log(a);

No.2

var a = 1,
    b = function a(x) {
        x && a(--x);
    };
console.log(a);

No.3

function a(x) {
    return x * 2;
}
var a;
console.log(a);

No.4

function b(x, y, a) {
    arguments[2] = 10;
    console.log(a);
}
b(1, 2, 3);

No.5

function a() {
    console.log(this);
}
a.call(null);

剖析

No.1

    在浏览器环境中,全局变量都是window的一个属性,即
var a = 1 等价于 window.a = 1in操作符用来推断某个属性属于某个对象,可所以对象的直接属性,也可所以经由过程prototype继续的属性。
    再看问题,在浏览器中,假如没有全局变量 a ,则声明一个全局变量 a (ES5没有块级作用域),而且赋值为1。很多人会以为打印的是1。非也,人人不要忘了变量声明会被前置!什么意思呢?问题也就等价于

var a;

if (!("a" in window)) {
    a = 1;
}

console.log(a);

所以实在已声清楚明了变量a,只不过if语句之前值是undefined,所以if语句压根不会实行。
末了答案就是 undefined

No.2

这道题有几个须要注重的处所:

  1. 变量声明、函数声明会被前置,然则函数表达式并不会,正确说相似变量声明前置,举个栗子:

console.log('b', b); // b undefined
var b = function() {}
console.log('b', b); // b function () {}

2.签字的函数表达式的名字只能在该函数内部取到,举个例子(消除老的IE?):

var foo = function bar () {}

console.log('foo', foo); 
// foo function bar(){}

console.log('bar', bar);
// Uncaught ReferenceError: bar is not defined

    综合这两点,再看问题,末了输出的内容就为 1

No.3

函数声明会掩盖变量声明,但不会掩盖变量赋值,举个栗子简朴粗犷:

function foo(){
    return 1;
}
var foo;
console.log(typeof foo);    // "function"

函数声明的优先级高于变量声明的优先级,但假如该变量foo赋值了,那效果就完整不一样了:

function foo(){
    return 1;
}
var foo = 1;
console.log(typeof foo);    // "number"

变量foo赋值今后,变量赋值初始化就掩盖了函数声明。这个须要注重
再看问题

function a(x) {
    return x * 2;
}
var a;
console.log(a); // function a(x) {...}

No.4

这题考核 arguments 对象的用法(详看?JavaScript中的arguments对象)
平常状况arguments与函数参数是动态绑定关联(为何说是平常稍后会诠释),所以很好明白,末了输出的是10

然则然则然则,我们不要忘了一个特殊状况–严厉形式,在严厉形式中 arguments 与相当于函数参数的一个拷贝,并没有动态绑定关联,举个栗子:

'use strict'
// 严厉形式!!

function b(x, y, a) {
    arguments[2] = 10;
    console.log(a);
}
b(1, 2, 3); // 3

No.5

function a() {
    console.log(this);
}
a.call(null);

关于 a.call(null); 依据ECMAScript262范例划定:
假如第一个参数传入的对象调用者是null或许undefined的话,call要领将把全局对象(浏览器上是window对象)作为this的值。所以,不论你什么时候传入null或许 undefined,其this都是全局对象window。所以,在浏览器上答案是输出 window 对象。

然则然则然则,我们照旧不能遗忘一个特殊状况–严厉形式,在严厉形式中,null 就是 nullundefined 就是 undefined ,举个栗子:

'use strict';
// 严厉形式!!

function a() {
    console.log(this);
}
a.call(null); // null
a.call(undefined); // undefined

提示

  1. 在浏览器中的全局对象是window,Node.js中是global;

  2. 为了使代码越发严谨与硬朗,发起写JS都加上严厉形式'use strict';

  3. ES6已成为前端必备妙技,号令人人都运用ES6,轻易高效,能够运用babel把ES6转成ES5以至ES3,只管运用ES6推进前端的生长?

About

GitHub: ?https://github.com/microzz
个人网站: ?https://microzz.com/

    原文作者:microzz
    原文地址: https://segmentfault.com/a/1190000009247847
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞