博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript平常会跳的坑系列(一)
阅读量:5320 次
发布时间:2019-06-14

本文共 1916 字,大约阅读时间需要 6 分钟。

function Foo() {          //定义foo函数    getName = function () { console.log('1');};    console.log(this);    return this;}Foo.getName = function () { console.log('2');};   //Foo创建了一个叫getName的静态属性存储了一个匿名函数Foo.prototype.getName = function () { console.log('3');};  //Foo的原型对象新创建了一个叫getName的匿名函数var getName = function () { console.log('4');};       //函数变量表达式创建了一个getName的函数function getName() { console.log('5');}      //声明一个叫getName函数//由于变量定义提升,该段JavaScript实际上的解析顺序如下/*function Foo() {          //定义foo函数    getName = function () { console.log('1');};    console.log(this);    return this;}var getName;function getName() { console.log('5');}Foo.getName = function () { console.log('2');};   //声明foo的getName静态属性Foo.prototype.getName = function () { console.log('3');};  //以foo为原型再声明一个getName静态属性getName = function () { console.log('4');};  */Foo.getName(); //2  //析:访问Foo函数上存储的静态属性      getName(); //4//由于变量定义提升,所有声明变量或声明函数都会被提升到当前函数的顶部,真正的执行顺序如下/*var getName;function getName() { console.log('5');}getName = function () { console.log('4');}; */Foo().getName(); //1//析:考察变量作用域问题,this指向问题;//先执行了Foo函数,然后调用Foo函数的返回值对象的getName属性函数//此时foo的返回值为Window对象//Foo函数的第一句  getName = function () { alert (1); };  是一句函数赋值语句,注意它没有var声明,所以先向当前Foo函数作用域内寻找getName变量,没有。再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量,找到了,也就是第二问中的alert(4)函数,将此变量的值赋值为 function(){alert(1)}。 //此处实际上是将外层作用域内的getName函数修改了。//注意:此处若依然没有找到会一直向上查找到window对象,若window对象中也没有getName属性,就在window对象中创建一个getName变量。getName(); //1//getName函数,相当于 window.getName() ,因为这个变量已经被Foo函数执行时修改了,遂结果与第三问相同,为1new Foo.getName(); //2//点(.)的优先级高于new操作,遂相当于是:new (Foo.getName)(); //所以实际上将getName函数作为了构造函数来执行,遂弹出2。new Foo().getName(); //3//析:Foo()返回的this是foo()对象,调用getName()匿名函数打印3new new Foo().getName(); //3//析:/*第七问, new new Foo().getName(); 同样是运算符优先级问题。 最终实际执行为: new ((new Foo()).getName)(); 先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new。 遂最终结果为3*/

  

转载于:https://www.cnblogs.com/Summer-jia/p/5192159.html

你可能感兴趣的文章
lamp环境安装
查看>>
疫情控制
查看>>
YUI3自动加载树实现
查看>>
String类中的toUpperCase()和toLowerCase()方法
查看>>
python知识思维导图
查看>>
IIS建网站以及建FTP
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
@修饰符--python中的装饰器
查看>>
新工具
查看>>
如何学习-维果茨基
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
学习AS3菜鸟起飞吧之—函数(二):函数之返回语句
查看>>
sap basis 常用事务码 --转
查看>>
迭代器
查看>>
传入值参数&传入引用参数的区别
查看>>
第13课 - 自动生成依赖关系(下)
查看>>
POJ No.2386【B007】
查看>>
点击复制插件clipboard.js
查看>>
LeetCode : Pascal's Triangle
查看>>