Foo.getName()的输出问题

news/2024/7/19 16:40:28 标签: js
<script>
  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();//4

  Foo().getName();//1

  getName();//1

  new Foo.getName();//2

  new Foo().getName();//3


</script>

Foo.getName()

<script>
  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
  
</script>

这个很简单就是简单的调用问题,找到Foo函数执行里面的getName


getName()

<script>
  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); }

  //请写出以下输出结果:

  getName();//4

</script>

全局上面有两个getName,首先 变量提升 getName=underfind 然后 function getName(){} (不执行) 由于这些都存储在栈里面所以先执行function getName()这里是5然后执行 var getName=function 这里输出4 (var getName=function会覆盖function getName(){}


Foo().getName()

<script>
  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();//1

</script>

这里先执行Foo()函数,Foo函数里面 return 了this,这里没有人调用Foo所以this指向Window,注意 :Foo()里面没有声明而是直接用getName所以getName是挂在在window上面的,这里输出1


getName()

在这里插入图片描述

这里的getName跟上次是不一样的,因为当调用Foo().getName()这个的时候在window上面就出现了getName 这个吧之前的getName都给覆盖了所以输出1


new Foo.getName()

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

  //请写出以下输出结果:
   new Foo.getName();//2

这里有一个js的优先级 ()的优先级最大所以应该执行的是 new (Foo.getName)() 执行全局的Foo.getName输出2


new Foo().getName()

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

  //请写出以下输出结果:
  new Foo().getName();//3

这里有两个运算符().()运算符优先级是最大的所以执行newFoo() 这里的this就指向他的实例了而不是window,然后执行实例的getName(),这里注意Foo函数里面的getName()是挂载在window上面的,而他的实例并没有getName(),所以去他的原型链去找,也就是执行Foo.prototype.getName = function () { alert(3); };输出3



http://www.niftyadmin.cn/n/1371474.html

相关文章

实现两个大数相加

<script> let a "9007199254740991"; let b "1234567899999999999";function add(a ,b){//取两个数字的最大长度let maxLength Math.max(a.length, b.length);//用0去补齐长度 padStart第一个参数为长度&#xff0c;第二个为要补全的元素a a.pad…

数组的去重

1.利用对象 思路&#xff1a;定义一个对象和数组&#xff0c;用对象来判断数组里的每一个元素是否一样&#xff0c;把数组的每一个都作为对象的key如果对象里面存在这个key当前就不添加到新数组中&#xff0c;没过没有就添加到新数组中 const arry[1,5,3,6,3,5,3,6,6,3,5,8,9,…

typeof与instanceof

typeof typeof 操作符返回一个字符串&#xff0c;表示未经计算的操作数的类型 typeof 1 // number typeof 1 // string typeof undefined // undefined typeof true // boolean typeof Symbol() // symbol typeof null // object typeof [] // object typeof {} // object ty…

vue3 toRow与markRaw、customRef 获取真实的对象用于操作该对象

toRow 作用&#xff1a;将生成的响应式数据转为普通数据&#xff0c;这样就可以操作该对象&#xff0c;以及获得该对象的属性。否则获取的是一个响应式对象&#xff08;输出是一个proxy对象&#xff09;。 markRaw 作用&#xff1a;标记一个对象&#xff0c;使其永远不会再…

vue3 setup中使用if当条件为真不进入if语句

需要写在onUpdated生命周期里面具体是为什么我也不知道&#xff0c;哪位的大佬可以帮我解答一下

null,undefined,NaN 的区别

undefined 表示不存在这个值。 undefined :是一个表示"无"的原始值或者说表示"缺少值"&#xff0c;就是此处应该有一个值&#xff0c;但是还没有定义。尝试读取时会返回 undefined 例如变量被声明了&#xff0c;但没有赋值时&#xff0c;就等于 undefine…

ES6看看看

https://es6.ruanyifeng.com/#docs/style

ES6的Set,Map,WeakSet,WeakMap

1.set 1.set可以存储引用数据类型 2.set中的数据都是唯一的&#xff08;可以用于初始化数组&#xff0c;实现数组的去重&#xff09; 3.Set实现了 iterator接口&#xff0c;所以可以使用扩展运算符和for…of…进行遍历&#xff0c;顺序就是插入的顺序 4.Map和Set中对象的引用都…