变量 和函数声明提前问题

经验总结:

  1、变量的声明被提前到作用域顶部,赋值保留在原地;

  2、函数声明整个被提前;

  3、函数作为值整个赋给变量时,只有变量“被提前”了,函数没有“被提前”。

作为最佳实践:

  变量声明一定放在作用域/函数最顶部(JavaScript只有函数作用域)。

举例:

// 变量声明被提前到作用域顶部,赋值保留在原地。
var a = ‘out‘;
(function inside(){
     alert(‘before: ‘ + a);      //undefined
     var a = ‘in‘;
     alert(‘after: ‘ + a);      //‘in‘
}())
alert(‘out: ‘ + a);  // ‘out‘

//相当于
var a = ‘out‘;
(function inside(){
     var a;   //声明提前
     alert(‘before: ‘ + a);      //a未被初始化,故为undefined
     a = ‘in‘;
     alert(‘after: ‘ + a);      //a被赋值,为‘in‘
}())
alert(‘out: ‘ + a);
// 函数声明整个被提前
// 函数声明格式:function fun(){...}
fun();  //‘Hello,world.‘
function fun(){ alert(‘Hello,world.‘); }
fun();  //‘Hello,world.‘

//函数作为值整个赋给变量时,只是变量被提前,函数未被提前
fun();   //TypeError错误,指出fun不是一个函数
var fun = function(){ alert(‘Hello,world.‘); };
fun();  //‘Hello,world.‘
相当于:
var fun;
fun();   //fun还未被初始化,所以它不是一个函数
fun = function(){ alert(‘Hello,world.‘); };
fun();  //‘Hello,world.‘

这个知识点具体细节大概就这么多,认真思考体会。

参考:

知乎话题

博客1

一些官方说明文档

时间: 2024-10-11 11:37:39

变量 和函数声明提前问题的相关文章

前端面试题总结一(js变量和函数声明提前相关)

好久没有更新博客了,^_^写写博客吧!下面是我总结的一些面试题,希望对大家有所帮助 (1)题目如下: alert(a)  var a=1  function a(){    alert(a) } 好多人肯定会觉得输出的结果是undefined,那你就错了,因为function也要声明提前的所以输出的结果应该是:: ? a(){alert(a)} 更有意思的来了如果我把上面的题改为如下: alert(a)function a(){ alert(a)}var a=1 输出的结果应该是:: ? a()

JavaScript 中对变量和函数声明的提前示例

如题所示,看下面的示例(可以使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发者工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter可以中途代码换行) var name = "xiaoming"; (function(){ var name = name || "小张"; console.info(name); })();// 小张 (function(){ name = name || "小张";

【JavaScript】4、执行环境、变量对象与声明提前

这段时间一直在看一些关于JavaScript的书,看到不明白的地方就满世界搜解答,结果今天晚上在搜索一个奇怪的语法的时候不小心点开一道面试题,是一道考察作用域的十年老题,于是我试着做了一下,果断被坑,结束后看解析,看得也不是很明白,于是赶紧回去看基础书,结果发现以前很多自己一眼扫过的知识点自己完全没有掌握,瞬间后悔万分,所以趁势赶紧重新学一下,同时把这些这些点记录下来. 原题是这样的: var tt = 'aa'; function test(){ alert(tt); var tt = 'dd

JavaScript(1)——变量、函数声明及作用域

这是我的第一篇博客文章,本人不才,文笔也不好,所以可能写的有点凌乱.有什么不对的地方还望见谅.不过每天进步一小步,总有一天会迈出那一大步.以下内容是我对变量.函数声明及函数表达式.作用域的理解. [变量]大意上来讲,变量就是所定义的一个可以用来保存值的占位符.定义变量时要使用var操作符. 变量所保存类型可以被改变,但不建议. var操作符定义的变量将成为该变量的作用域中的局部变量,在函数退出后,变量将被销毁. 若省略var操作符可以定义全局变量,不过在严格模式下会导致抛出ReferenceEr

JavaScript 中对变量和函数声明的“提前(hoist)”的那些事儿

变量声明“被提前” JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对“先声明.后使用”的规则很熟悉,如果使用未经声明的变量或函数,在编译阶段就会报错.然而,JavaScript 却能够在变量和函数被声明之前使用它们.下面我们就深入了解一下其中的玄机. 先来看一段代码: (function() { //ReferenceError: noSuchVariable is not defined console.log(noS

(转)JavaScript 中对变量和函数声明的“提前(hoist)”

变量声明“被提前” JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对“先声明.后使用”的规则很熟悉,如果使用未经声明的变量或函数,在编译阶段就会报错.然而,JavaScript 却能够在变量和函数被声明之前使用它们.下面我们就深入了解一下其中的玄机. 先来看一段代码: (function() { //ReferenceError: noSuchVariable is not defined console.log(noS

JavaScript 中对变量和函数声明的“提前(hoist)”

hoist vt.升起,提起; vi.被举起或抬高; n.起重机,升降机; 升起; <俚>推,托,举; 这篇文章不讲英语,但是对于某些英语单词找不到很好的翻译,一上来就列出“hoist”这个单词的释义是为了让大家有个准备,我在这里将此单词翻译为“提前”,是为了解释 JavaScript 语言中很“古怪”的一个特性. 变量声明“被提前” JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对“先声明.后使用”的规则很熟悉,如果

变量提升和函数声明提前

1. instanceof是如何判断的? * 表达式: A instanceof B * 如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false 2. Function是通过new自己产生的实例 /////////////////////////////////面试题/////////////////////////////////////////////////// function A () { } A.prototype.n = 1 var b = new A()

JS变量与函数声明提升补充

1.默认情况下,函数声明的优先级高于变量声明的优先级:一旦变量被赋值,不会被函数声明覆盖 var a; function a() { console.log('a'); } var b = 1; function b() { console.log('b'); } console.log(a);//function a console.log(b);//b 2.命名函数表达式的标示符(即函数名称)在外部作用域是无效的 var f = function foo(){ return typeof f