1.原题:

function Foo() {
getName = function () { alert (); };
return this;
}
Foo.getName = function () { alert ();};
Foo.prototype.getName = function () { alert ();};
var getName = function () { alert ();};
function getName() { alert ();} //请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

下面是我个人的分析:(先进行变量和函数的提升,在进行分析)

  function Foo(){
getName = function(){//这里是函数表达式,但是没有使用var,执行的时候,会现在当前作用域查找有没有getName,如果有就返回,如果没有就想上找,直到直到全局作用域下,本例中,当前作用域没有,但是全局作用域中有var getName的声明,并且还有赋值,这个时候,会被他覆盖掉,变成getName = function(){console.log(1)};也就是覆盖了下面的getName = function(){console.log(4)};
console.log();
}
return this;
} var getName;
// Foo().getName();
function getName(){console.log()};//函数声明,在函数提升的时候会把整个函数体提升
Foo.getName = function(){console.log()};//给Foo中创建了一个getName的属性,并赋值了一个匿名函数
Foo.prototype.getName=function(){console.log()};
getName = function(){console.log()};//这里是赋值操作,会覆盖40行的函数声明 Foo.getName();////访问Foo中的静态属性getName,也就是上面的赋值的匿名函数,所以输出的2
getName();//4因为45的赋值操作覆盖了42行的函数声明,顾输出的是4
Foo().getName();//1这里是这样操作的(Foo()).getName();我们可以看出Foo()属于window调用,this指向的就是window,
        他返回的this就是window,所以这里就相当于window.getName();window调用的时候会在当前作用域下找有没有getName,如果有就执行,
        这里全局环境的的赋值也就是getName = function(){console.log(4)};但是他已经被Foo中的getName覆盖了,变成了getName = function(){console.log(1)};
        所以这里输出的就是1;(注意这些覆盖是发生在调用的时候);;这里涉及this的问题
getName();//1、、由于上面的操作,getName = function(){console.log(4)};已经被覆盖成了getName = function(){console.log(1)};
            所以这里再直接访问getName()的时候,已经变了1
new Foo.getName();//2这里涉及的时候运算符的优先级,点的优先级高于new的优先级。所以先执行Foo.getName的操作,那就是输出2
new Foo().getName();//3这里也是优先级的问题,小括号的优先级最高,所以是(new Foo()).getName();那么就是先实例一个Foo的对象,然后去调用实例方法getName();
      根据属性搜索原则,先去构造函数中找,没有就上原型中去找,这里构造函数Foo中没有,但是原型中已经添加了getName = function(){console.log(3)};所以这里输出的是3
new new Foo().getName();////还是优先级的问题,应该是new ((new Foo()).getName)();先实例化Foo,在将Foo原型中的getName当成构造函数,
                    继续实例化,然后调用
// 这里我们写一个小demo
function fn(){
setName = function(){console.log()};
}
fn.prototype.setName= function(){console.log()};
// new new fn().setName();
// console.log(new((new fn()).setName)());
new((new fn()).setName)();

2.获取100 - 1000之内的左右水仙花数

 var daffodil = () => {
var temp = []
var x,y,z,sum
for (var i = 100; i < 1000; i++) {
x = parseInt(i / 100)
y = parseInt(i % 100 / 10)
z = parseInt(i % 100 % 10)
sum = Math.pow(x, 3) + Math.pow(y, 3) + Math.pow(z, 3)
if (i == sum) {
temp.push(i)
}
}
return temp
} var x = daffodil()
console.log(x)

最新文章

  1. EF循环迭代导致如此严重的性能丢失,你知道?
  2. Android 中的常用方法
  3. 【Python】一、除法问题及基本操作(逻辑与,if替代switch)及支持中文打印
  4. Nginx跨域配置方法
  5. js 数组遍历for..in弊端
  6. 精选37条强大的常用linux shell命令组合
  7. Python学习笔记1(基础语法)
  8. 大数据加减(Big data addition and subtraction)
  9. ajax 状态码
  10. RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】
  11. LEMP平台全编译搭建
  12. c++ 入门之对象指针
  13. 发布自己的类库到NuGet
  14. Pandas截取列的一部分
  15. 在平衡树的海洋中畅游(二)——Scapegoat Tree
  16. 集大软件工程15级个人作业Week1
  17. web(二)html
  18. 20155330 《网络对抗》 Exp9 web安全基础实践
  19. [Java]Spring框架
  20. MySQL 5.6比较重要的参数,以及5.5到5.6默认值有过变化的参数

热门文章

  1. ZOJ2107 Quoit Design 最近点对
  2. POJ1808 平方(二次)同余方程
  3. nodejs实现验证码
  4. Java源码——Integer
  5. 清北考前刷题day2早安
  6. robotframework - 框架做接口自动化get请求
  7. BADI FCODE(菜单) 增强
  8. 基于itchat实现微信群消息同步机器人
  9. Http协议对格式、请求头、方法
  10. [译]libcurl_tutorial