JS经典理解例子
1.
var name = 'the window';
var obj = {
name:"my obj",
getNameFunc:function(){
return function(){
return this.name;
}
}
};
alert(obj.getNameFunc()());//问输出结果是多少
答案:the window
理解:这里的obj.getNameFunc()返回了一个function,然后再再外面调用这个function,这时候调用function的是window对象,所有输出the window
2.
var name = 'the window';
var obj = {
name:"my obj",
getNameFunc:function(){
var that = this;
return function(){
return that.name;
}
}
};
alert(obj.getNameFunc()());//问输出结果是多少
答案:my obj
理解:返回的这个function是getNameFunc的一个内部函数,而他使用了外部函数定义的变量,所以产生了闭包,再调用执行return that.name;的时候,可以再闭包中找到这个that变量(即外部函数的this),所有最终相当于调用了obj 的name,所以返回my obj
3.
function A(){}
A.prototype.n = 1;
var b = new A();
A.prototype={
n:2,
m:3
}
var c = new A();
console.log(b.n,b.m,c.n,c.m);//问输出多少
答案:1,undefined,2,3
理解:b 对象的原型__proto__指向的是第一次创建A functon的时候的A的prototype,只是上面多加了一个属性n值为1。当后面改变A的prototype的指向另外一个对象时并不会改变b对象的__proto__的指向,只是改变了后面新创建的c对象的指向。
4.
var F = function (){}
Object.prototype.a = function (){
console.log('a()');
}
Function.prototype.b = function (){
console.log('b()');
}
var f = new F();
f.a();
f.b();
F.a();
F.b();
问依次输出是什么?
答案:a() 报错 a() b()
理解:首先执行var F = function (){}的时候创建了F,F的__proto__指向Function的prototype,所以再Function的prototype上面加的属性F是可以访问的,所以F.b();应该输出b()。而Function的prototype是Object的一个对象,这个对象是由Object作为Function产生的,所以这个这个对象的__proto__指向Object的prototype,所以F.a();应该输出a()。
var f = new F();所以f .__proto__指向F 的prototype,而F的的prototype是Object的一个对象,这个对象是由Object作为Function产生的,所以这个这个对象的__proto__指向Object的prototype,所以f.a();应该输出a()。而prototype和Functiono的prototype没有直接联系,所以f.b();应该会报错找不到这个方法。
5.
console.log('global begin:'+i);
var i = 1;
foo(1);
function foo(i){
if(i==4){
return;
}
console.log('foo begin:'+i);
foo(i+1);
console.log('foo end:'+i);
}
console.log('global end:'+i);
问:所有的输出结果
答案:global begin:undefined foo begin:1 foo begin:2 foo begin:3 foo end:3 foo end:2 foo end:1 global end:1
理解:这个比较简单,按代码执行顺序就能知道结果。
6.
function a (){}
var a;
console.log(typeof(a));//问输出什么
答案:function
理解:变量提升先于函数提升,所以先执行变量提升a=undefined,然后再将a赋值给函数。
7.
if(!(b in window))
{
var b = 1;
}
cnsole.log(b);//问输出什么
答案:undefined
理解:再es5里面没有块作用域,所以再{var b = 1;}相当于再外面执行var b = 1;,由于变量提升再代码执行前window中就有了b属性只是值为undefined,所以b in window为true,不执行判断语句里面的代码,输出undefined
8.
var c = 1 ;
functiong c(c){
console.log(c);
}
c(2);//问输出什么
答案:报错:c不是一个函数
理解:由于函数和变量提升,所以实际的执行顺序是:var c ; function c(c){console.log(c);}; c = 1; c(2);
9.
var x = 10;
function fn(){
console.log(x);
}
function show(f){
var x = 20;
f();
}
show(fn);
问:输出结果是什么
答案:10
理解:由于fn是最外层的函数所以没有闭包产生,应该用函数的作用域来解决,函数的作用域是再定义函数的时候就已经产生了,并不是代码执行的时候产生,所以即便把fn作为参数传到了show()函数里面,但是执行代码时使用的作用域是定义函数时候的,fn是在最外层定义的,所以当自己内部找不到x的时候会去window上面找。
10.
var fn = function (){
console.log(fn);
}
fn();
var obj = {
f2:function(){
console.log(f2);
}
}
obj.f2();
问:输出结果是什么
答案:function (){console.log(fn);} 报错:找不到f2
理解:根据作用域,这里会生成三个作用域:最外层作用域/fn 作用域/f2作用域。根据自己找不到到外层去找,第一个外层能找到,第二个外层找不到;
注:如果第二个想输出obj的f2,则function中要写成console.log(this.f2); this指向调用这个函数的对象也就是obj。
JS经典理解例子的更多相关文章
- js经典闭包
setTimeout函数之循环和闭包 前言 之前对于setTimeout的一个经典问题的理解总是感到很迷惑,现在好像清晰一点了,所以把我的理解写下来,我对js的理解也不深入,如果有错误,请务必指出.以 ...
- js经典试题之原型与继承
js经典试题之原型与继承 1:以下代码中hasOwnProperty的作用是? var obj={} …….. obj.hasOwnProperty("val") 答案:判断obj ...
- jquery ui中的dialog,官网上经典的例子
jquery ui中的dialog,官网上经典的例子 jquery ui中dialog和easy ui中的dialog很像,但是最近用到的时候全然没有印象,一段时间不用就忘记了,这篇随笔介绍一下这 ...
- js面向对象理解
js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...
- js经典试题之数组与函数
js经典试题之数组与函数 1:列举js的全局函数? 答案:JavaScript 中包含以下 7 个全局函数escape( ).eval( ).isFinite( ).isNaN( ).parseFlo ...
- JS之理解继承
JS之理解继承:https://segmentfault.com/a/1190000010468293 1.call继承,也叫借用构造函数.伪造对象或是经典继承.call继承回把父类的私有属性和方法继 ...
- Js经典相册
Js经典相册 点击下载
- vue自定义指令(Directive中的clickoutside.js)的理解
阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...
- 【前端】Vue.js经典开源项目汇总
Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) ...
随机推荐
- Android学习15
Date&Time DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图): 1.TextClock TextClock可以以字符串格式显 ...
- Spring - Spring Boot - Actuator Web 访问开启
1. 概述 打开 Spring Boot Actuator 的 Web 访问 2. 场景 之前看 Spring 的时候, 曾经想了解当时的配置 后来发现, 确实有这么个工具 刚开始发现, 除了 act ...
- python闯关之路二(模块的应用)
1.有如下字符串:n = "路飞学城"(编程题) - 将字符串转换成utf-8的字符编码的字节,再将转换的字节重新转换为utf-8的字符编码的字符串 - 将字符串转换成gbk的字符 ...
- SniperOJ-as fast as you can-Writeup
SniperOJ-as fast as you can-Writeup 题目描述: 打开所给的题目地址 很容易可以看出这是一个简单的爬虫问题,爬去网页的信息并post,但在界面及网页源码中均没发现有价 ...
- mybatis - buildSqlSessionFactory()
buildSqlSessionFactory() 这个方法比较长, 干的事情也比较多. 包括一些别名, 插件, 类型处理器等的解析. 从主流程上来看, 最主要的其实是干了两件事:1. 对 mapper ...
- ubuntu 安装 gd
最近装一套系统,提示没开启GD, 1.首先检查一下,是否安装 新建一个文件 <?php phpinfo(); ?> 如果安装了,会在页面显示 2.没安装当然没有了 这个安装也是根据php版 ...
- CSS - 引入方法
1. 外部样式表 <head> <link rel="stylesheet" type="text/css" href="style ...
- 批量给文件加一个后缀 .bak , 一条命令去掉文件的后缀 linux
给当前文件夹下面的所有文件加上一个后缀 == 一条命令解决 ll | awk '{print $9}' | grep -v '^[ ]*$' |sed -r 's#(.*)#mv \1 \1.bak# ...
- Node.js 服务端处理图片
Node 服务端处理图片 服务端进行图片处理是很常见的需求,但是Node在这一块相对来说比较薄弱.找了几个比较常见的模块来解决问题. gm GraphicsMagick for node 使用Open ...
- ASP.NET(C#) Json序列化反序列化帮助类Jsonhelper
原文地址:https://ken.io/note/csharp-asp.net-jsonhelper using System; using System.Collections.Generic; u ...