刷题记

2017-12-21  本文已影响17人  心彻

如下代码输出结果:

var a = 1;
function f(){
    var a = 2;
    var e = eval;
    e('console.log(a)');
}
f();

结果是1

这题考察的是eval的用法

直接调用时,作用域时局部的,间接调用时,作用域时全局的,所以如果代码修改如下:

var a = 1;
function f(){
    var a = 2;
    eval('console.log(a)');
}
f();

结果是2

JavaScript模块化编程的参考资料:
Javascript模块化编程(一):模块的写法
Javascript模块化编程(二):AMD规范
Javascript模块化编程(三):require.js的用法

function A() {
    this.do=function() {return ‘foo’;};
}
A.prototype=function() {
    this.do=function() {return ‘bar’};
};
var x=new A().do();

x 的值是:foo
知识点:只有实例对象上不存在的属性和方法才会去原型对象上找。

var x = new Boolean(false);
if (x) {
  alert('hi');
}
var y = Boolean(0);
if (y) {
  alert('hello'); 
}

结果只会alert一个hi
new Boolean()返回一个对象
Boolean()返回一个具体的布尔值

ECMAScript 继承机制实现

var f = function g() {
        return 23;
    };
typeof g();

结果是Error
解析:
在 JS 里,声明函数只有 2 种方法:
第 1 种: function foo(){...} (函数声明)
第 2 种: var foo = function(){...} (等号后面必须是匿名函数,这句实质是函数表达式)

除此之外,类似于 var foo = function bar(){...} 这样的东西统一按 2 方法处理,即在函数外部无法通过 bar 访问到函数,因为这已经变成了一个表达式。

但为什么不是 "undefined"?
这里如果求 typeof g ,会返回 undefined,但求的是 g(),所以会去先去调用函数 g,这里就会直接抛出异常,所以是 Error。

--------------------------------update on 2 Feb 2018----------------------------------------
七月份的尾巴_3b13同学的指出,还可以借助Function这个构造函数来声明函数,方式如下:
var foo=new Function(参数1,参数2,...函数体);
参考:JavaScript几种函数声明方式的区别

上一篇下一篇

猜你喜欢

热点阅读