变量声明和函数声明提升,及有关的面试题

var getName = function(){
    console.log(2);
}
function getName (){
    console.log(1);
}
getName();

上面输出结果为2

function getName(){    //函数声明提升到顶部
    console.log(1);
}
var getName;    //变量声明提升

getName = function(){    //变量赋值依然保留在原来的位置
    console.log(2);
}
getName();    // 最终输出:2函数首先会被提升,然后才是变量以下输出结果依次为2 4 1 1 2 3 3
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();                 因为function getName(){alert(5)}声明在最上面,执行时结果被覆盖掉所以弹出4
Foo().getName();           Foo()返回的是window,Foo()执行的时候要找getName变量,找到外面的变量getName,被重新赋值为内部的function(){alert(1)}所以弹出1
getName();                 getName被上一步赋值为1,所以此处弹出1
new Foo.getName();         new (Foo.getName)()弹出2
new Foo().getName();      (new Foo()).getName();new Foo()执行后返回的实例上没有getName属性,去原型上找输出3
new new Foo().getName();   new ((new Foo()).getName)();先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new,故最终结果为3
 

原文地址:https://www.cnblogs.com/dylAlex/p/11087275.html

时间: 2024-08-25 13:08:23

变量声明和函数声明提升,及有关的面试题的相关文章

javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)

平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种函数的创建,究竟他们用起来有什么区别呢,今天就本着打破砂锅问到底的精神,好好来说说这个让人神魂颠倒的--函数声明.  函数声明 函数声明示例代码 function fn () { console.log('fn 函数执行..'); // code.. } 这样我们就声明了一个名称为fn的函数,这里出个思考,你认

浅谈JS变量声明和函数声明提升

先来两个问题 很多时候,在直觉上,我们都会认为JS代码在执行时都是自上而下一行一行执行的,但是实际上,有一种情况会导致这个假设是错误的. a = 2; var a; console.log(a); 按照传统眼光,console.log(a)输出的应该是undefined,因为var a在a = 2之后.但是,输出的是2. 再看第二段代码: console.log(a); var a = 2; 有人会想到第一段代码,然后回答undefined.还有人会认为a在使用前未被声明,因此抛出Referen

[js]变量声明、函数声明、函数定义式、形参之间的执行顺序

一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('ledi2'); }; ledi(); 执行顺序: var ledi: function ledi(){ alert('ledi1'); }; //预编译结束 ============== ledi(); ledi = function (){ alert('ledi2'); }; ledi(); 函数

javascript变量声明与函数声明提升

在JavaScript中,在声明变量或者函数前就使用变量或者函数,会产生以外的错误.这些在很多JS的笔试题中都会出现. 先看下面这道题: 1 (function( ) { 2 var x = foo( ); 3 var foo = function foo( ){ 4 return "foobar" : 5 } 6 return x; 7 })( );问:上面函数的返回值是() A.类型错误B.foobarC.undefinedD.foo( )答案应该选A,而不是D.说到这原因大家应该

javascript中函数声明、变量声明以及变量赋值之间的关系与影响

函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 3.变量声明被提升到范围作用域的顶端 4.变量声明比函数声明的优先级高,变量声明优先于函数声明被提升,如果两者同名同时存在,后被提升的函数声明会覆盖先被提升的变量声明 5.变量赋值不会被提升,到执行行代码才开始赋值 补充: 6.调用javascript函数的整个过程可以分为预编译期(也叫声明期)和赋值期(也叫计算执行期). 预编译期完成对所有变量(包括形参.函数内部

JS执行顺序-函数声明提升、匿名函数、函数表达式

大方向上: JS 是按照 代码块 进行 编译.执行 的. 学习至: 1.变量声明提升 2.新唐的博客 3.js中匿名函数的创建与调用方法分析 4.前端圣经 - 高程三 5.深入理解变量声明提升和函数声明提升 因为没有好好地分类.可能会比较杂.为了系统地学习,先了解几个概念. 一. <script> 区分的代码块. JS是按照代码块 编译 和 执行的.代码块间 相互独立,但是 变量和方法 共享. <script> alert('代码块一'); </script> <

关于Javascript中通过var关键字声明变量和function关键字声明函数的笔记

一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1,b,c; //关键字显式声明变量a,b,c,并给a赋值console.log(a); //1 //由于b,c未定义变量类型,因此输出"undefined"console.log(b); //undefinedconsole.log(c); //undefined //如果变量未声明,则输出

JS函数声明和函数表达式的关系

1.函数声明 1 // 函数声明 2 function funDeclaration(type){ 3 return type==="Declaration"; 4 } 2.函数表达式 // 函数表达式 var funExpression = function(type){ return type==="Expression"; } JS代码在解析时会进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用.而函数表达式的值是在JS运行时确定

“函数声明”、“函数原型”与“函数定义”辨析

最近在看一本关于C的书,对函数声明和函数定义的定义很是模糊,分不清楚,百度了一下,发现一篇帖子写的很是不错,转载过来: 原文: 对函数的“定义”和“声明”不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立 的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否 正确,实参与形参的类型和个数是否一致),它不包括函数体.————谭浩强 ,<C程