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经典理解例子的更多相关文章

  1. js经典闭包

    setTimeout函数之循环和闭包 前言 之前对于setTimeout的一个经典问题的理解总是感到很迷惑,现在好像清晰一点了,所以把我的理解写下来,我对js的理解也不深入,如果有错误,请务必指出.以 ...

  2. js经典试题之原型与继承

    js经典试题之原型与继承 1:以下代码中hasOwnProperty的作用是? var obj={} …….. obj.hasOwnProperty("val") 答案:判断obj ...

  3. jquery ui中的dialog,官网上经典的例子

    jquery ui中的dialog,官网上经典的例子   jquery ui中dialog和easy ui中的dialog很像,但是最近用到的时候全然没有印象,一段时间不用就忘记了,这篇随笔介绍一下这 ...

  4. js面向对象理解

    js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...

  5. js经典试题之数组与函数

    js经典试题之数组与函数 1:列举js的全局函数? 答案:JavaScript 中包含以下 7 个全局函数escape( ).eval( ).isFinite( ).isNaN( ).parseFlo ...

  6. JS之理解继承

    JS之理解继承:https://segmentfault.com/a/1190000010468293 1.call继承,也叫借用构造函数.伪造对象或是经典继承.call继承回把父类的私有属性和方法继 ...

  7. Js经典相册

    Js经典相册 点击下载

  8. vue自定义指令(Directive中的clickoutside.js)的理解

    阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...

  9. 【前端】Vue.js经典开源项目汇总

    Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) ...

随机推荐

  1. Linux - Shell - 在多个文件中查找关键字

    1. 概述 在多个文件中 查找内容 2. 想干啥 目的 在 多个文件 中, 查找内容 准备 之前在 单个文件里 查找过内容 工具 awk 前提 文件有固定格式 查找时有字段的要求 例子 # print ...

  2. Python 摄像头 树莓派 USB mjpb

    import cv2 import urllib.request import numpy as np import sys host = "192.168.1.109:8080" ...

  3. shell查找七天之前的文件

    #!/bin/bashaweekago=`date -d "7 days ago" +%s`for f in $(ls) do stat -c %Y ${f} aa=`stat - ...

  4. 安装SQL Server 2014(Windows Server 2016)

    SQL Server 2014下载地址: 链接:https://pan.baidu.com/s/1FBkdCBeqaIcLMQnUmtfPwg    提取码:6y76 1.使用解压工具解压“cn_sq ...

  5. 吴裕雄 人工智能 java、javascript、HTML5、python、oracle ——智能医疗系统WEB端智能分诊代码简洁版实现

    <%-- Document : getInfo Created on : 2018-10-7, 21:36:37 Author : acer --%> <%@page import= ...

  6. Django ORM中的模糊查询

    ORM映射 什么是ORM映射?在笔者认为就是对SQL语句的封装,所写语句与SQL对应语句含义相同,使开发更加简单方便,不过也是存在弊端的,使程序运行效率下降.例如: UserInfo.objects. ...

  7. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

  8. C语言知识点记录

    1,栈底指针不变,栈顶指针变化. 2,结构化程序包括:顺序,分支,循环. 3,详细设计的任务是为软件结构图的每一个模块确定实现算法和局部数据结构. 4,数据操纵语言:负责数据的操纵,包括查询及增,删, ...

  9. Jmeter进行分布式性能测试

    由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 ...

  10. 语义化标签&唯一性标签

    语义化标签 em\i表示倾斜,b\strong表示加粗,但其中只有strong和em具有着重的语义 img:alt属性当图片无法显示,显示alt的文字,根本需求是为了SEO,是必须属性,alt属性长度 ...