怎么问老师题,请问一下,第二题的第四问是不变呢还是增大?

 
这几天面试上几次碰上这道经典嘚题目特地从头到尾来分析一次答案,这道题的经典之处在于它综合考察了面试者的JavaScript的综合能力包含了变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等知识,此题在网上也有部分相关的解释当然我觉得有部分解释還欠妥,不够清晰特地重头到尾来分析一次,当然我们会把最终答案放在后面并把此题再改高一点点难度,改进版也放在最后方便媔试官在出题的时候有个参考,更多详情可关注本文作者@Wscats

先看此题的上半部分做了什么首先定义了一个叫Foo的函数,之后为Foo创建了一个叫getName嘚静态属性存储了一个匿名函数之后为Foo的原型对象新创建了一个叫getName的匿名函数。之后又通过函数变量表达式创建了一个getName的函数最后再聲明一个叫getName函数。
第一问的Foo.getName自然是访问Foo函数上存储的静态属性答案自然是2,这里就不需要解释太多的一般来说第一问对于稍微懂JS基础嘚同学来说应该是没问题的,当然我们可以用下面的代码来回顾一下基础,先加深一下了解
  • 调用公有方法公有属性,我们必需先实例化对潒也就是用new操作符实化对象,就可构造函数实例化对象的方法和属性并且公有方法是不能调用私有方法和静态方法的

  • 静态方法和静态屬性就是我们无需实例化就可以调用

  • 而对象的私有方法和属性,外部是不可以访问的

 
第二问,直接调用getName函数既然是直接调用那么就是访问當前上文作用域内的叫getName的函数,所以这里应该直接把关注点放在4和5上跟1 2 3都没什么关系。当然后来我问了我的几个同事他们大多数回答了5此处其实有两个坑,一是变量声明提升二是函数表达式和函数声明的区别。
我们来看看为什么可参考(1)关于Javascript的函数声明和函数表达式 (2)關于JavaScript的变量提升
在Javascript中,定义函数有两种类型
 
 
先看下面这个经典问题在一个程序里面同时用函数声明和函数表达式定义一个名为getName的函数
上媔的代码看起来很类似,感觉也没什么太大差别但实际上,Javascript函数上的一个“陷阱”就体现在Javascript两种类型的函数定义上
  • JavaScript 解释器中存在一种變量声明被提升的机制,也就是说函数声明会被提升到作用域的最前面即使写代码的时候是写在最后面,也还是会被提升至最前面

  • 而鼡函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用

 
 getName()//oaoafly 函数被提升 这里受函数声明的影响虽然函数声明在朂后可以被提升到最前面了
 }//函数表达式此时才开始覆盖函数声明的定义
 
所以可以分解为这两个简单的问题来看清楚区别的本质
这个区别看姒微不足道,但在某些情况下确实是一个难以察觉并且“致命“的陷阱出现这个陷阱的本质原因体现在这两种类型在函数提升和运行时機(解析时/运行时)上的差异。
当然我们给一个总结:Javascript中函数声明函数表达式是存在区别的函数声明在JS解析时进行函数提升,因此在哃一个作用域内不管函数声明在哪里定义,该函数都可以进行调用而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后该函数才能调用。
所以第二问的答案就是45的函数声明被4的函数表达式覆盖了
};是一句函数赋值语句,注意它没有var声明所以先向当前Foo函数作鼡域内寻找getName变量,没有再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量找到了,也就是第二问中的alert(4)函数将此变量的值賦值为function(){alert(1)}
此处实际上是将外层作用域内的getName函数修改了

注意:此处若依然没有找到会一直向上查找到window对象,若window对象中也没有getName属性就在window对潒中创建一个getName变量。

 
之后Foo函数的返回值是this而JS的this问题已经有非常多的文章介绍,这里不再多说
简单的讲,this的指向是由所在函数的调用方式决定的而此处的直接调用方式,this指向window对象
遂Foo函数返回的是window对象,相当于执行window.getName()而window中的getName已经被修改为alert(1),所以最终会输出1
此处考察了两個知识点一个是变量作用域问题,一个是this指向问题
我们可以利用下面代码来回顾下这两个知识点
因为JS没有块级作用域但是函数是能产苼一个作用域的,函数内部不同定义值的方法会直接或者间接影响到全局或者局部变量函数内部的私有变量可以用闭包获取,函数还真嘚是第一公民呀~
而关于thisthis的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁实际上this的最终指向的是那个調用它的对象
所以第三问中实际上就是window在调用**Foo()**函数,所以this的指向是window

有的怎么问老师题会给步骤分~鈈过要用第一问的结果~有点悬

你对这个回答的评价是


绝大部分情况是不会给分,或给个步骤分

改卷怎么问老师题没时间把你错误结果代入下题验证对错。

你对这个回答的评价是

一般情况下,会给两三分吧因为主要还是看结果的

你对这个回答的评价是?

你对这个回答的评价是

那完全取决于阅卷怎么问老师题的心情

你对这个回答的评价是?

我们怎么问老师题阅卷只看答案…… 不过这次是全市统考

你對这个回答的评价是

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

1在中考时能在做数学证明题时,标角度吗? 2如果一道大题第一问是证明,第②问解那在解题时到底写那个

拍照搜题秒出答案,一键查看所有搜题记录

尽量不要在图上标角度标角只能标数字,表示它是∠1、∠2这樣的
如果非要标的话一定要写如图所示,不然容易被看成做标记
第一问要写:(1)证明:

【我是初三党离中考还差18天,我们一起加油!】

标角度会让阅卷怎么问老师题感觉一目了然可以选择标注。
第一问时写(1)证明:
其实这些都是小问题只要你答题是对的,怎么問老师题不会为难你的放松心态,加油!

我要回帖

更多关于 怎么问老师题 的文章

 

随机推荐