在javascript中关于变量与函数的提升
在javascript中关于变量与函数的提升
一、简介
在javascript中声明变量与函数的执行步骤:
1、先预解析变量或函数声明代码,会把用var声明的变量或者函数声明的代码块进行提升操作
2、然后再进行执行操作
关于变量声明提升:用var声明的变量提升,其只是变量提升了,而没有进行赋值的提升
二、关于变量与函数提升的注意点
1、变量提升的代码演示
var a = 10;
console.log(a);//10
console.log(b);// undefined
var b = 20;
console.log(b);//20
/*变量提升演示*/
var a; // 变量提升 只提升不赋值
var b;// 变量提升 只提升不赋值
a = 10; // 赋值操作
console.log(a);// 10
console.log(b);// 由于b还没有赋值,所以 undefined
b = 20; // 赋值操作
console.log(b);// 20
2、两函数名相同的情况下,后面的函数声明会覆盖前面的函数声明
var a = 10;
var b = 20;
function funcName() {
console.log(a);
}
function funcName(){
console.log(b);
}
funcName();// 20
/*变量与函数提升演示*/
var a;
var b;
function funcName(){//后面的覆盖了前面的函数声明
console.log(b);
}
a = 10;
b = 20;
funcName(); // 20
3、变量名与函数名相同的情况下,只会提升函数声明,而不提升变量声明
var a = 10;
function funcName() {
console.log(a);
}
funcName();// 10
var funcName = '字符串';
console.log(funcName);// 字符串
funcName();// Uncaught TypeError:funcName is not a function
/*变量与函数提升演示*/
var a;
function funcName() {
console.log(a);
}
a = 10;
funcName();// 10
var funcName = '字符串';// 与函数同名变量声明忽略提升
console.log(funcName);// 字符串
//由于重新给funcName赋值,funcName是一个字符串了,而不是函数,无法调用
console.log(typeof funcName);// string
funcName();// Uncaught TypeError:funcName is not a function
4、用函数表达式声明函数时,函数声明提升,只会提升变量,而不是整个函数提升
say()//Uncaught TypeError: say is not a function
var say = function() {
console.log('hello');
};
/*函数声明演示*/
var say;// 函数表达式声明函数,只提升变量
say();// Uncaught TypeError: say is not a function
say = function () {
console.log('hello');
};
5、变量与函数的提升是分作用域的
function sayHello() {
console.log('hello');// hello
function sayHi() {
console.log(a); // 10
console.log(b); // undefined
}
sayHi();
var b = 10;
}
var a = 10;
sayHello();
console.log(b);// Uncaught ReferenceError: b is not defined
/*函数与变量提升演示*/
function sayHello() {
function sayHi() {
console.log(a); // 10 a是全局变量,函数内部可以访问
console.log(b); // undefined
}
var b;
console.log('hello');// hello
sayHi();//调用时b还没有赋值,所以undefined
b = 10;
}
var a;
a = 10;
sayHello();// 函数调用
// b 是局部变量,函数之外无法访问
console.log(b);// Uncaught ReferenceError: b is not defined
三、关于函数提升与变量提升的测试题
第一题
function show() {
var a = 123;
console.log(a); //?
}
show();
console.log(a); //?
第二题
var str = "string";
show();
function show() {
console.log(str); //?
var str = "字符串";
console.log(str); //?
}
第三题
if("a" in window){
var a = 10;
}
console.log(a); // ?
第四题
function show(){
if("a" in window){
var a = 10;
}
console.log(a); // ?
}
show();
第五题
var a = 1;
function show() {
if(!a)
{
var a = 10;
}
console.log(a); //?
}
show();
第六题
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(); // ?
四、 答案
第一题
function show() {
var a = 123;
console.log(a); //123
}
show();
console.log(a); //Uncaught ReferenceError: a is not defined(未定义)
/*变量提升演示*/
function show() {
var a;
a = 123;
console.log(a); //123
}
show();
console.log(a); //Uncaught ReferenceError: a is not defined(未定义)
第二题
var str = "string";
show();
function show() {
console.log(str); //undefined
var str = "字符串";
console.log(str); //字符串
}
/*变量提升演示*/
var str;
function show() {
var str;
console.log(str); //undefined
str = "字符串";
console.log(str); //字符串
}
str = "string";
show();
第三题
if("a" in window){
var a = 10;
}
console.log(a); // 10
/*变量提升演示*/
var a;// 全局变量
if("a" in window){ // true
a = 10;
}
console.log(a); // 10
第四题
function show(){
if("a" in window){
var a = 10;
}
console.log(a); // undefined
}
show();
/*变量提升演示*/
function show(){
var a;// 局部变量 不是全局变量
if("a" in window){// false
a = 10;
}
console.log(a); // undefined
}
show();
第五题
var a = 1;
function show() {
if(!a)
{
var a = 10;
}
console.log(a); // 10
}
show();
/*变量提升演示*/
var a;
function show() {
var a;
if(!a)// Blooean(undefined) == false !a == true
{
a = 10;
}
console.log(a); // 10
}
a = 1;
show();
第六题
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(); // 2
getName(); // 4
Foo().getName(); // 1
getName(); // 1
new Foo.getName(); // 2
new Foo().getName(); // 3
new new Foo().getName(); // 3
/*函数与变量提升演示*/
function Foo() {
getName = function(){ alert(1); };//
return this;
}
var getName;
//function getName(){ alert(5); }//被 getName = function() { alert(4); };覆盖
Foo.getName = function() { alert(2); };//构造函数的静态方法
Foo.prototype.getName = function(){ alert(3); };// 原型方法
getName = function() { alert(4); };
Foo.getName(); // ? 2 构造函数调用自己的静态方法
//getName = function(){ alert(1); }; 覆盖 getName = function() { alert(4); };
getName(); // ? 4 window.getName(); 5已经被4覆盖
Foo().getName(); // ? 1 Foo()中this指向window,方法调用把getName = function() { alert(4); };用getName = function(){ alert(1); };覆盖
getName(); // ? 1 window.getName() 就是调用getName = function(){ alert(1); };
new Foo.getName(); // ? 2 Foo.getName() 构造函数调用自己的静态方法 new 2 == 2
new Foo().getName(); // ? 3 (new Foo()).getName() 对象调用原型方法
new new Foo().getName(); // ? 3 new 3 == 3
五、源码链接
https://github.com/350469960/OS/blob/master/javascript/promotion.md
在javascript中关于变量与函数的提升的更多相关文章
- JavaScript 中对变量和函数声明提前的演示样例
如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...
- 关于Javascript中声明变量、函数的笔记
一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1, ...
- JavaScript 中对变量和函数声明的“提前”
变量声明“被提前” JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对“先声明.后使用”的规则很熟悉,如果使用未经声明的变量或 ...
- (转)JavaScript 中对变量和函数声明的“提前(hoist)”
变量声明“被提前” JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对“先声明.后使用”的规则很熟悉,如果使用未经声明的变量或 ...
- JavaScript 中对变量和函数声明的“提前(hoist)”
hoist vt.升起,提起; vi.被举起或抬高; n.起重机,升降机; 升起; <俚>推,托,举; 这篇文章不讲英语,但是对于某些英语单词找不到很好的翻译,一上来就列出“hoist”这 ...
- 关于javascript中变量及函数的提升
javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...
- JavaScript 中的变量命名方法
三种命名方法 在程序语言中,通常使用的变量命名方法有三种:骆驼命名法(CamelCase),帕斯卡命名法(PascalCase)和匈牙利命名法. 依靠单词的大小写拼写复合词的做法,叫做"骆驼 ...
- [转]Javascript中的自执行函数表达式
[转]Javascript中的自执行函数表达式 本文转载自:http://www.ghugo.com/javascript-auto-run-function/ 以下是正文: Posted on 20 ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
随机推荐
- Linux怎样访问Windows共享文件和文件夹
常常使用Windows的人可能会发现,Windows计算机之前共享资料非常方便,但是有时候想玩玩Linux的时候,如Fedora.Ubuntu.CentOS等,该怎样才能访问Windows计算机上的文 ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- centos7 安装R和Rstudio客户端
#官网下载R和Rstudio 我下载的是 R-3.2.1.tar.gz和rstudio-0.99.467-x86_64.rpm两个版本 rstudio没有看见有centos版的,下的这个RStudio ...
- 如何检测 Android Cursor 泄漏
简介: 本文介绍如何在 Android 检测 Cursor 泄漏的原理以及使用方法,还指出几种常见的出错示例.有一些泄漏在代码中难以察觉,但程序长时间运行后必然会出现异常.同时该方法同样适合于其他需要 ...
- [Angular Tutorial]PhoneCat Tutorial App
(注:曾经在<不敢止步>一书中看到学到一个观点,作者认为学习一门技术最好的方法就是翻译某部领域书籍.这里我决定做一次尝试,接下来花1个月左右时间,将Angular Tutorial Pho ...
- C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...
- iOS 之 自动释放池
向一个对象发送autorelease消息时,cocoa会将该对象的一个引用放入最新的自动释放池.作用域结束时,自动释放池会被释放,池中所有的对象也就被释放了.
- php Excel文件导入 Spreadsheet_Excel_Reader
刚刚开通博客,希望能够通过博客的形式记录自己的学习与成长,同时也希望能够和路上的同僚们多交流,共同进步 小白 -> 大神 go! go! go!! 先总结一下前几天写的Excel导入吧,希 ...
- Servlet 应用程序事件、监听器
Web容器管理Servlet/JSP相关的生命周期,若对HttpServletRequest对象.HttpSession对象.ServletContxt对象在生成.销毁或相关属性设置发生的时机点有兴趣 ...
- CentOS6+MySQL5.6二进制安装
一般我们安装mysql采用二进制安装的方式就足以满足我们的生产环境了,不过需要我们配置my.cnf文件 从官网下载二进制MySQL,选择Linux-Generic,最后这两个是二进制包 http:// ...