变量定义提升、运算符优先级、对象属性及原型属性优先级

介绍:考察了包括变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等许多知识点。

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();

答案是:2、4、1、1、2、3、3

解释:

(1)首先定义了一个叫Foo的函数,之后为Foo创建了一个叫getName的静态属性存储了一个匿名函数,之后为Foo的原型对象新创建了一个叫getName的匿名函数。之后又通过函数变量表达式创建了一个getName的函数,最后再声明一个叫getName函数。第一问的 Foo.getName 自然是访问Foo函数上存储的静态属性,自然是2。

(2)第二问,直接调用 getName 函数。既然是直接调用那么就是访问当前上文作用域内的叫getName的函数,所以跟1 2 3都没什么关系。此题有无数面试者回答为5。此处有两个坑,一是变量声明提升,二是函数表达式。

变量声明提升:即所有声明变量或声明函数都会被提升到当前函数的顶部

函数表达式:var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,而 function getName 是函数声明。关于JS中的各种函数创建方式可以看 大部分人都会做错的经典JS闭包面试题 这篇文章有详细说明。函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。

(3)第三问的 Foo().getName(); 先执行了Foo函数,然后调用Foo函数的返回值对象的getName属性函数。Foo函数的第一句  getName = function () { alert (1); };  是一句函数赋值语句,注意它没有var声明,所以先向当前Foo函数作用域内寻找getName变量,没有。再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量,找到了,也就是第二问中的alert(4)函数,将此变量的值赋值为 function(){alert(1)}。此处实际上是将外层作用域内的getName函数修改了。

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

之后Foo函数的返回值是this,this的指向是由所在函数的调用方式决定的。而此处的直接调用方式,this指向window对象。遂Foo函数返回的是window对象,相当于执行 window.getName() ,而window中的getName已经被修改为alert(1),所以最终会输出1

(4)直接调用getName函数,相当于 window.getName() ,因为这个变量已经被Foo函数执行时修改了,遂结果与第三问相同,为1

(5)第五问 new Foo.getName(); ,此处考察的是js的运算符优先级问题。

通过查上表可以得知点(.)的优先级高于new操作,遂相当于是:

new (Foo.getName)();所以实际上将getName函数作为了构造函数来执行,遂弹出2。

(6)第六问 new Foo().getName() ,首先看运算符优先级括号高于new,实际执行为(new Foo()).getName()

遂先执行Foo函数,而Foo此时作为构造函数却有返回值,所以这里需要说明下js中的构造函数返回值问题。

构造函数的返回值:

在传统语言中,构造函数不应该有返回值,实际执行的返回值就是此构造函数的实例化对象。而在js中构造函数可以有返回值也可以没有。

1、没有返回值则按照其他语言一样返回实例化对象。

2、若有返回值则检查其返回值是否为引用类型。如果是非引用类型,如基本类型(string,number,boolean,null,undefined)则与无返回值相同,实际返回其实例化对象。

3、若返回值是引用类型,则实际返回值为这个引用类型。

原题中,返回的是this,而this在构造函数中本来就代表当前实例化对象,遂最终Foo函数返回实例化对象。之后调用实例化对象的getName函数,因为在Foo构造函数中没有为实例化对象添加任何属性,遂到当前对象的原型对象(prototype)中寻找getName,找到了。遂最终输出3。

(7)第七问, new new Foo().getName(); 同样是运算符优先级问题。最终实际执行为:new ((new Foo()).getName)();

先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new。遂最终结果为3

后记:运算符优先级可参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

 

 

 

 

 

 

转载于:https://my.oschina.net/ochmdlc/blog/1821809

weixin_33989780
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
raddsl:用于DSL编译器快速原型制作的工具
01-31
Pratt,“自上而下的运算符优先级”。 POPL。 卷73. 1973年。 Roman R. Redziejowski,“鼠标:从解析表达式到实用的解析器。” 并发规范和编程研讨会。 2009年。 Becket,Ralph和Zoltan Somogyi。
经典的javascript面试题
u014651643的博客
02-18 642
题目如下: [js] view plaincopy function Foo() {    getName = function () { alert (1); };    return this;   }   Foo.getName = function () { alert (2);};   Foo.prototype.getName 
变量优先级
11-27 121
形式参数名>内置对象>funname //hi function foo(foo){alert(foo);} foo('hi'); //number function foo(arguments){alert(typeof arguments);} foo(100); //object,js 中调用会导致引擎崩溃 function arguments(argum...
javascript 一些关于原型理解和for in的遍历
liyeford的博客
05-06 1607
function Protect(name){ this.name=name; } //原型是一个对象,其他对象可以通过它实现属性继承。 Protect.prototype.name="张三"; var p=new Protect('李四'); console.log(p.name);//李四  自身的大于原型优先级 p.name='王五'; console.log(p.na
javascript文档
08-11
delete 运算符 删除对象属性,或删除数组中的一个元素。 description 属性 返回或设置关于指定错误的描述字符串。 Dictionary 对象 存储数据键、项目对的对象。 dimensions 方法 返回 VBArray 的维数。 除法...
源文件程序天下JAVASCRIPT实例自学手册
05-05
2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本处理流程 2.8.2 if条件假设语句 2.8.3 switch流程控制语句 2.8.4 for循环语句 2.8.5 while和do-while循环语句 2.8.6 使用break和continue进行循坏控制 2.8.7 with对象...
JavaScript详解(第2版)
04-25
 13.7.3 使用事件对象属性   13.7.4 将事件传递给JavaScript函数   13.7.5 鼠标坐标   13.7.6 按键事件   13.8 处理事件的脚本模型   13.9 应知应会   练习   第14章 CSS与JavaScript   ...
learn-js:js内部基础原理,深刻理解js的运行机制
05-01
-JavaScript- js内部基础原理,深刻理解js的运行机制 包括声明提前、this指针指向、运算符优先级原型、继承、全局变量污染、对象属性原型属性优先级等 Fullscreen() in test1.js 数据
`“use strict“`在JavaScript中是什么?它背后的原理是什么?
Jerry学长
05-27 1063
JavaScript的严格模式(strict mode)是ECMAScript 5引入的一项特性。如果你在脚本或函数的顶部声明 ,你就启用了严格模式: 当JavaScript引擎看到这个指令时,它将开始以一种特殊的模式解释代码。在这种模式下,当检测到某些可能导致潜在错误的编码实践时,会抛出错误。这就是严格模式背后的基本原理。考虑下面这个例子: 开发者可能因为强迫症而对齐数值字面量,但这样会无意中使变量 初始化为八进制字面量。在非严格模式下,这将被解释为值 (十进制)。然而,在严格模式下,这样的代码会抛出错
书籍学习|基于SprinBoot+vue的书籍学习平台(源码+数据库+文档)
JIngJaneIL的博客
05-28 1144
首先,论文一开始便是清楚的论述了平台的研究内容。其次,剖析平台需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确平台的需求。然后在明白了平台的需求基础上需要进一步地设计平台,主要包罗软件架构模式、整体功能模块、数据库设计。本项目软件架构选择B/S模式和java技术,总体功能模块运用自顶向下的分层思想。再然后就是实现平台并进行代码编写实现功能。论文的最后章节总结一下自己完成本论文和开发本项目的心得和总结。通过书籍学习平台将会使书籍学习各个方面的工作效率带来实质性的提升
Vue3实战笔记(52)—Vue 3封装持仓分析饼图
山花的博客
05-30 395
接上文,封装持仓分析饼图。封装好几个组件,用于后续开发。把忧愁煮成茶,让它在心间慢慢沉淀,剩下的,便是清甜的回味。
Vue3 - 实现一个雨水滴落的动画效果
良月柒
05-29 150
在 Vue 3 中实现一个雨水滴落的动画效果,可以使用 HTML5 的元素和 JavaScript 来绘制和控制动画。
React-useState
weixin_46479909的博客
05-29 234
本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化(useState是一个React Hook(函数),它允许我们向组件添加一个。,从而控制影响组件的渲染结果。
React后台管理(十三)-- 页面常用hook封装 --- useTable封装
weixin_43883615的博客
05-29 373
紧接上一篇,本篇主要讲和表格相关的全局hook函数封装。结构分析:(1)这个 useTable 钩子的功能是用于管理表格的高度(2)接受一个可选的 params 对象作为参数,可以包含 id 和 offset 两个属性(3)定义getHeight函数,实时计算表格区域高度,控制滚动区域下一篇讲【示例页面构建教学】。关注本栏目,将实时更新。
KeyExpirationEventMessageListener监听器的使用
最新发布
qq_47910339的博客
05-31 413
KeyExpirationEventMessageListener监听器的使用
[Nodejs]使用adm-zip和fs-extra压缩打包后的文件
ice_cream__的博客
05-29 219
现在学到了一种新方法,通过nodejs环境来实现文件、文件夹的复制粘贴,还有压缩解压缩等操作,那就是使用adm-zip、fs-extra这两个工具。
uniapp页面vue3下拉触底发送获取新数据请求实现分页功能
05-27 502
页面下拉触底获取新数据实现分页功能实现方式有两种,根据自己的业务需求来定,不同的方案适用场景不一样,有的是一整个页面下拉获取新数据,有的是部分盒子内容滚动到底部时候实现获取新数据,下面讨论一下两种方式的区别。
基于python flask+pyecharts实现的中药数据可视化大屏,实现基于Apriori算法的药品功效关系的关联规则
weixin_49081159的博客
05-29 945
在中医药学中,物品与功效之间的关联关系研究是一个非常重要的课题。传统中医药学中,很多药物都具有多种功效,而且不同药物对同一种疾病可能具有不同的疗效。因此,挖掘物品与功效之间的关联关系,可以帮助我们更加准确地认识和应用中医药宝库中的药物,从而提高中医药学的治疗效果和水平。随着信息技术的快速发展,Python作为一种流行的编程语言,已经被广泛应用于中医药学领域。Python具有丰富的第三方库和工具,例如NumPy、Pandas、Matplotlib等,这些库和工具为中医药学数据挖掘提供了丰富的工具和支持。
jQuery下载教程
xiaodingzi127的博客
05-28 205
官网:https://jquery.com/界面上邮件保存为js文件即可。在html文件中引入即可。
verilog运算符优先级
05-01
Verilog运算符优先级定义了不同运算符之间的计算先后顺序,保证了表达式的正确性和准确性。Verilog运算符优先级从高到低依次为: 1.一元运算符(包括逻辑非、位取反、符号取反等):这些运算符是最高优先级的,因为...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区? 22530
  • VS中编译出现——计算机中丢失XINPUT1_4.dll解决办法 13666
  • 游戏外挂内存数据读取 11767
  • TortoiseGit 合并分支方法 9020
  • typeScript面试必备之-通识一 8198

最新评论

  • 摩拜单车红包骑行引发的潮汐问题思考

    RandomW: 感谢,真的太感谢了!最近搜集了很多资料在思考好几种思路,论文算法也看了很多。本来已经被搞花了眼了,现在感觉就这么弄好了。不纠结了。

  • 图文并茂开发AR小游戏全教程(一)

    炭烤小肥杨.228: 你好,皮卡丘的模型文件能再分享一下嘛🌹

  • lockf函数的使用

    干坏事p过: 少年,我看你骨骼精奇,不如来我博客看看可好

  • 使用递归遍历并转换树形数据(以 TypeScript 为例)

    士别三日wyx: 好文,学到了表情包

  • [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)

    万万大妞: 地址失效了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • matlab练习程序(SUSAN检测)
  • DataTable筛选出现异常
  • delphi之精确找图
2019年419篇
2018年688篇
2017年946篇
2016年536篇
2015年418篇
2014年338篇
2013年302篇
2012年256篇
2011年219篇
2010年162篇
2009年113篇
2008年89篇
2007年80篇
2006年37篇
2005年16篇
2004年10篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源鬻怎么读生辰起名测试打分神之墓地2.6a无cd无限蓝农业肥料公司起名鬓边不是海棠红百度云手游起名名字大全2020年生的孩子起名字马天宇老婆叫什么名狗年张姓男孩起名瑞雪兆丰年的下一句魏姓氏取名起名大全北半球的孤单物流公司名称免费起名大全psp官网程姓女小孩起名给女装起名袁姓起名最高分的名字cscec82闷得儿蜜是什么意思专家起名生意起名豆制品加盟店2010年万年历心如止水什么意思陌生的恋人电视剧张姓猪宝宝取名起名大全维字起名字的意思药物涂抹调教敏感依赖任我发育怎么起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化