首页 > 代码库 > JavaScript一些重要知识点结合题目的表现!
JavaScript一些重要知识点结合题目的表现!
function Foo() { //① 声明一个Foo的函数
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);}; ② 为Foo创建一个叫getName的静态属性存储一个匿名函数
Foo.prototype.getName = function () { alert (3);}; ③为Foo的原型对象创建一个叫getName的匿名函数
var getName = function () { alert (4);}; ④通过表达式创建一个getName的函数
function getName() { alert (5);} ⑤声明一个叫getName的函数
① Foo.getName(); //2 直接访问Foo函数上存储的静态属性 2
② getName(); //4
③ Foo().getName(); //1
④ getName(); //1
⑤ new Foo.getName(); //2
⑥ new Foo().getName();
⑦ new new Foo().getName();
科普一下静态属性和静态方法;
function Myobject(){ this.instanceProp="456"; // 实例属性instanceProp this.instanceMethod=function(){}; //实例方法instanceMethod } Myobject.prototype.protoProp="789"; Myobject.prototype.protoMethod=function(){ }; Myobject.staticProp="123"; //这样子添加的属性static就叫做静态属性 Myobject.staticMethod =function(){ //这样添加的方法staticMethod就叫做静态方法 }; var myobject=new Myobject();
以上属性和方法都是依赖于对象,JS中都是对象,函数也是对象
为一个函数的原型对象赋值后就会存在,
以这个函数为构造函数创建的实例对象能够访问到原型的属性及方法
第一问知识点:
- 调用公有方法,公有属性,我们必需先实例化对象,也就是用new操作符实化对象,就可构造函数实例化对象的方法和属性,并且公有方法是不能调用私有方法和静态方法的
- 静态方法和静态属性就是我们无需实例化就可以调用
- 而对象的私有方法和属性,外部是不可以访问的
第二问知识点:
- JavaScript 解释器中存在一种变量声明被提升的机制,也就是说函数声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。
- 而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用
Javascript中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
第三问知识点:
Foo().getName();
先执行了Foo函数,然后调用Foo函数的返回值对象的getName属性函数。
执行Foo函数的时候,由于里面是一句赋值语句;(没有var声明);先向Foo函数作用域里面寻找getName变量,没有找到;所以向函数的作用域上层寻找是否有getName变量;其实是第④行表达式声明的函数;此时再在函数里面赋值为function(){alert(1);},之后Foo函数返回是this,调用的时候指向他本身。所已此时的答案为1;
知识点 : this指向、函数表达式声明提前,作用域;
第四问知识点: ps:直接调用 getName函数 相对于window.getName();这个变量已经被Foo函数执行时给修改了;所以与第三问相同;
第五问知识点 :
打点.访问的优先级高于new()无参数运算符 参考运算符优先级https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
第六问和第七问都是实例化对象,然后调用实例化对象的方法;所以得到3
原文链接:https://juejin.im/entry/58db95eaac502e0058f8472e?from=timeline
JavaScript一些重要知识点结合题目的表现!