几个细节需要注意
2016-02-22 15:17
393 查看
题目:function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; var getName = function () { alert (4);}; function getName() { alert (5);}
//请写出以下输出结果: Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName();
1、函数表达式
var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,而 function getName 是函数声明。
函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。
例如下代码:
console.log(x);//输出:function x(){} var x=1; function x(){}
实际执行的代码为,先将 var x=1 拆分为 var x; 和 x = 1; 两行,再将 var x; 和 function x(){} 两行提升至最上方变成:
var x; function x(){} console.log(x); x=1;
所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。
同理,原题中代码最终执行时的是:
function Foo() { getName = function () { alert (1); }; return this; } var getName;//只提升变量声明 function getName() { alert (5);}//提升函数声明,覆盖var的声明 Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; getName = function () { alert (4);};//最终的赋值再次覆盖function getName声明 getName();//最终输出4
2、变量声明提升
即所有声明变量或声明函数都会被提升到当前函数的顶部。
例如下代码:
console.log('x' in window);//true var x; x = 0;
代码执行时js引擎会将声明语句提升至代码最上方,变为:
var x; console.log('x' in window);//true x = 0;
相关文章推荐
- 变量和常量
- Finalize()、Dispose()、SafeHandle、GC
- ANDROID_MARS学习笔记_S05_001_用SensorManager获取传感器
- 【Java】换底公式
- Jenkins系列2--安装和配置
- 评委打分
- gcc -D 选项和setenv
- 常见布局
- 回归了
- MySQL处理重复数据的方法
- 经典的”服务器最多65536个连接”误解
- 详解Android开发中硬件加速支持的使用方法
- JSON: Circular Dependency Errors
- [置顶] 前端面试整理********************************************************
- oracle to_number
- java在方法中的匿名内部类
- Badboy参数化 - Add Variable(循环使用不同的关键字进行搜索)
- 字典树讲解
- Linux笔记(9)——挂载命令和用户登录查看命令
- windows下mongodb安装