如下代码输出结果:
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()返回一个具体的布尔值
- 只要 协议 、 域名 、 端口 有任何一个 不同, 都被当作是 不同 的域。
- js如何判断一个对象是不是Array?
- 加号优先级高于 三目运算。
- var a=b=3 相当于 var a = 3;b = 3;b是全局的
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几种函数声明方式的区别