Javascript基础知识小测试(一)
这段时间看了《你不知道的JavaScript》上卷,对很多知识有了重新的认识,所以在这里罗列一些知识点作为巩固。
作用域和闭包
词法作用域
- 变量赋值操作会执行的两个动作
 
答:编译器会在当前作用域中声明一个变量,前提是之前没有声明过。运行时引擎会在内存中查找该变量然后为它赋值。
- RHS 和 LHS 查询
 
答:查找容器用LHS查找,查找相应值用RHS查找
- 在作用域顶层无法找到目标变量,在严格模式和非严格模式下有什么结果?
 
答:非严格模式会创建一个全局变量,严格模式不会并且会报错。
- with的副作用
 
答:将变量泄露到全局上
 function foo( obj ) {
   with( obj ) {
     a = 2;
   }
 }
 var obj = { b: 3 };
 foo( obj );
 console.log( obj.a ); // undefined
 console.log( a ); // 2 -------> a泄露到了全局上
- 匿名函数的三个缺点
 
答:1、不利于调试
2、降低可读性
3、在递归时容易出错,由于递归是调用自身,匿名函数无法用函数名调用自身。
- IIFE是什么
 
答:自执行函数,有两种形式:
 (function(xx) {...})();
 (function(xx) {...}());
- JS的块作用域以及如何隐式模拟块作用域?
 
答:js没有强类型语言那样的块作用域,可以用let声明变量达到块作用域实现的效果。
- let 和 var 在变量声明有什么区别?
 
答:let声明的变量不会提升,var会。
- 提升(变量、函数有什么区别)
 
答:函数比变量更早提升。
闭包
- 闭包产生的原理
 
 function foo() {
     function bar() {};
      /*...*/
 }
- 闭包遇上for循环,问题、机制、解决办法(考虑let)
 
答:详情参见我前面关于闭包的博客。
- 模块的两个必要条件
 
答:1、要有一个外部嵌套函数。
2、封闭函数必须返回至少一个内部函数。
- import 和 module 的区别
 
答:import会导入模块中的一个或多个API分别绑定在一个变量上,module将整个模块的API导入并绑定到一个变量上。
this和对象原型
this
- 胖箭头 => 的作用原理
 
答:用当前词法作用域覆盖了this本来的值。
- this是运行时绑定还是编译时绑定?
 
答:运行时。
- this的四个绑定及其原理
 
答:1、默认绑定:默认绑定全局变量window。
2、隐式绑定
3、显式绑定:使用call()、apply()
4、new绑定:函数创建对象时用new
- 绑定的优先级
 
答:new、显式 > 隐式 > 默认
- 为什么setTimeout()中的this会默认绑定到window?
 
答:setTimeout是一个定义在全局中的函数,所以该函数的this默认为window。
- 写一个硬绑定bind(obj, target);
 
 function bind(fn, target) {
   return function() {
     return fn.apply(target, arguments);
   };
 }
- 硬绑定的优势
 
答:任由外部如何变动,内部的this绑定对象不会改变。
- 使用new调用函数时会发生的四个步骤?
 
答:1、创建一个全新的对象。
    2、对这个新对象执行[prototype]链接。
    3、这个新对象会被绑定到函数调用的this。
4、如果函数没有返回值,那么new表达式中的函数调用会自动返回这个新对象,否则返回函数返回值。
对象
- js中的六个基本类型、六个内置对象
 
答:六个基本类型:null、string、number、boolean、undefined、object
六个内置对象:String、Number、Boolean、Object、Function、Array
- 函数从来不会属于某一个对象
 - 对象中内置的get函数的函数名和函数值分别代表什么?
 
答:函数名------->对象属性名,函数值------->对象属性值
- in 和 hasOwnPrototype 的区别
 
答:in会在对象中以及原型链中查找对象是否含有该属性,而hasOwnPrototype只会在该对象中查找。
- for...in 的特点?为什么说数组的遍历尽量不用 for...in?
 
答:会遍历对象所有可枚举的属性,并且不一定按照顺序遍历。
类
- 类的继承其实就是复制,js不能复制
 - 隐式混入和显式混入的区别
 
答:前者直接全部“复制”过来,后者用call、apply
原型
- 原型链上存在隐式屏蔽
 - Foo.prototype的 .constructor 属性是一直存在的吗?
 
答:不是,它是默认的。当你的prototype对象改变了,这个属性就不存在了除非你手动添加。
- var b = Object.create(a);的作用机制
 
答:创建一个对象b并关联到a。
行为委托
- 一句话概括
 
答:函数的继承,对象的委托
- 委托的两个原则
 
答:1、状态保存在委托者,而不是委托目标。
2、避免在[prototype]链上的不同位置使用相同的命名
- 委托的实质?
 
答:某些对象找不到方法或者属性的引用时可以把请求委托给另一个对象。
- 根据下面函数继承写出相应的行为委托
 
 function A(name) {
   this.name = name;
 }
 A.prototype.sayName = function() {
   console.log(this.name);
 };
 function B(name) {
   A.call(this, name);
 }
 B.prototype = Object.create(A.prototype);
 var b = new B('Nic');
 b.sayName(); //Nic
 var A = {
   init: function(name) { this.name = name; },
   sayName: function() { console.log(this.name); }
 };
 var B = Object.create(A);
 B.init('Nic');
 B.sayName() //Nic
- 将函数封装对象
 - 将构造函数内部的变量定义封装成一个函数
 - 将prototype对象的函数逐一封装进该对象
 - 将两个对象关联
 - 此时没有继承的说法了,关联不是上下级的关系,而是任意的
 - 关联后可以自定义或者封装新对象的一些属性及方法
 - 注意:尽量避免暴露委托
 
class
- class不能声明属性只能声明方法
 
 class A {
   constructor(name, age) {
     this.name = name;
     this.age = age;
   }
   sayName() {
     console.log('hello, my name is: '+this.name);
   }
 }
 var a = new A('wind', 20);
 a.sayName(); //hello, my name is: wind
API设计原则
- 最小特权原则:最小限度的暴露必要内容,而将其他内容都“隐藏”起来(将变量声明在某个作用域内尽量不在全局作用域中)
 - 尽量避免匿名函数
 - 关联关系中尽量避免函数名重复,会引发屏蔽覆盖的副作用
 - 内部委托(在内部调用)比直接委托(直接使用)可以让API接口更加清晰
 - 委托最好在内部实现,不要轻易的暴露出去
 
Javascript基础知识小测试(一)的更多相关文章
- java基础知识小总结【转】
		
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
 - Javascript基础知识总结一
		
Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
 - 学习javascript基础知识系列第三节 - ()()用法
		
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
 - java基础知识小小结
		
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
 - JavaScript 基础知识 - BOM篇
		
前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...
 - 学习javascript基础知识系列第二节 - this用法
		
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
 - (转)JAVA AJAX教程第二章-JAVASCRIPT基础知识
		
开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用 ...
 - JavaScript基础知识整理
		
只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...
 - JavaScript基础知识笔记
		
做前端几年了,一直疏于整理归纳,所以这两天把基础看了一遍,加上使用经验,整理了基础知识中关键技术,旨在系统性的学习和备忘.如果发现错误,请留言提示,谢谢! 重要说明:本文只列举基础知识点,中级和高级内 ...
 
随机推荐
- 让Flash支持Stage3D
			
如要需要支持Stage3D,采用GPU来渲染,需要设置wmode="direct",在FB中,对于web和air设置方法不同: 1.web: 需要在web的html模板中,添加参数 ...
 - Hadoop-2.x启动HDFS和YARN的方式
			
逐一启动(实际生产环境中的启动方式) * sbin/hadoop-daemon.sh start|stop namenode|datanode|journalnode * sbin/yarn-daem ...
 - Hadoop权威指南:通过FileSystem API读取数据
			
Hadoop权威指南:通过FileSystem API读取数据 [TOC] 在Hadoop中,FileSystem是一个通用的文件系统API 获取FileSystem实例的几个静态方法 public ...
 - C++ Primer 笔记 第二章
			
C++ Primer 第二章 变量和基本类型 2.1基本内置类型 有算数类型和void类型:算数类型储存空间大小依及其而定. 算数类型表: 类型 含义 最小储存空间 bool 布尔型 - char 字 ...
 - MySQL 存储表情字符
			
摘要 在 MySQL 中直接存储表情的时候,会出现无法插入数据的错误. 这是由于一般情况下,MySQL 的字符集是 utf8,而对于 emoji 表情的 mysql 的 utf8 字符集是不支持,需要 ...
 - js中的3种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令式
			
alert("A"); confirm("B");var name = confirm("B");if(name){ alert(" ...
 - Webappbuilder自定义widget模板
			
Webappbuilder自定义widget模板 by 李远祥 到\\widgets\samplewidgets目录下拷贝 CustomWidgetTemplate 文件并重命名为MyWidget 设 ...
 - SQL2012还原数据库操作在本地服务器上操作和用别的电脑远程连接到服务器进行操作的文件路径差异
			
在数据库服务器上想还原一个数据库到某个备份文件时期的,服务器的数据库文件本身是保存在 D:\DEVDB目录 通过开发电脑上的MS manager来连接数据库服务器操作还原 虽发现文件卡项上,原始文件名 ...
 - java多线程四种实现模板
			
假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程? 这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快... 这里把模板放在这里,需要用的时候寻找合适的来选用. 总体分为两 ...
 - 设置/修改wampserverd默认项目地址
			
打开WampServer安装目录下bin\apache\Apache2.4.4\conf\文件夹打开httpd.conf 首先我们安装完wampserver后一般默认的项目存放地址如下: " ...