1.前言为了node.js做准备,js的基本功还是很重要的。所以正值1024程序员节的时候所以找了些题目,整理了一下知识点。这篇文章感觉代码太多,难免枯燥,所以文章最后留了个彩蛋给读者。

2.简单回调

代码

function foo(){

console.log(this.a);

}

function doFoo(fn){

fn();

}

function doFoo2(o){

o.foo();

}

var obj = {

a: 2,

foo: foo

};

var a = "I'm an a";

doFoo(obj.foo);

doFoo2(obj);

 

分析

在Javascript中,this指向函数 执行时的当前对象,而非声明环境y有
执行doFoo的时候执行环境就是doFoo函数,执行环境为全局。
执行doFoo2时是在对象内部调用函数,this指针指向该对象。
结果

I'm an a

2

3、用apply改变函数作用域

代码

function foo(somthing){

console.log(this.a, somthing);

}

function bind(fn, obj){

return function(){

return fn.apply(obj, arguments);

}

}

var obj = {

a:2

}

var bar = bind(foo, obj);

var b = bar(3);

 

分析

apply、call、bind都有个作用就是改变作用域,这里用apply将foo函数的作用域指向obj对象,同时传入参数。
再简单分析一下bind函数内部的嵌套,执行bind函数的时候返回的是一个匿名函数,所以执行bar(3)的时候实际上是执行的bind内部的匿名函数,返回的是之前传入的foo函数的执行结果。
函数没有返回值的情况下默认返回undefined。
结果

2 3

undefined

4.new关键字

function foo(a,b){

this.val = a+b;

}

var bar = foo.bind(null, 'p1');

var baz = new bar('p2');

console.log(baz.val);

console.log(b);

分析

bind函数的第一个参数为null代表作用域不变,后面的不定参数将会和函数本身的参数按次序进行绑定,绑定之后执行函数只能从未绑定的参数开始传值。

结果

p1p2

5.自执行函数

function foo(){

console.log(this.a);

}

var a = 2;

var o = {a:3,foo:foo};

var p = {a:4};

(p.foo=o.foo)();

 

分析

经常可以看到这样的代码

(function(){

//...

})()

这种代码通常是创建一个立即执行的函数同时避免污染全局变量。
很少有人去关注赋值语句执行之后会返回什么结果,其实就是返回当前值。也就是说当括号内执行完赋值之后,返回的是o对象中的foo函数。函数的执行环境中有一个a对象,嗯,就是它了~
答案

2

6.变量属性

var a = [];

a[0] = 1;

a['foobar'] = 2;

console.log(a.length);

console.log(a.foobar);

分析

当一个变量被声明后,扩充其属性并不会改变原数据类型。

结果

1

2

 

7.精度问题

var a = 'foo';

a[1] = 'O';

console.log(0.1+0.2==0.3||a);

分析

当操作小数时请小心,js的小数计算并不精确,所以上面的判断是false。

字符串变量是常量。

结果

foo

8.命名提升

foo();

var foo = 0;

function foo(){

console.log(1);

}

foo = function(){

console.log(2);

};

分析

声明的变量和命名函数都会被提升到代码的最前面,只不过声明的变量的赋值语句在代码中的位置不变。所以上面这段代码应该被理解为:

var foo;

function foo(){

console.log(1);

}

foo();

foo = 0;

foo = function(){

console.log(2);

};

结果

1

思考

foo();

var foo = 0;

function foo(){

console.log(1);

}

foo();

foo = function(){

console.log(2);

};

foo();

上面代码的结果:

1

报错

9、作用域

foo();

var a = true;

if(a){

function foo(){

console.log('a');

}

} else {

function foo(){

console.log('b');

}

}

分析

javascript并不是以代码段为作用域,而是以函数。
再根据命名提升的原则,所以这段代码应该是这样的:

function foo(){

console.log('a');

}

function foo(){

console.log('b');

}

foo();

var a = true;

if(a){

} else {

}

结果

b

10.闭包陷阱

for(var i=1;i<=5;i++){

setTimeout(function(){

console.log(i);

}, i*1000);

}

分析

闭包有个重要的作用就是,在内层函数引用外层函数定义的变量时,外层函数的变量不会被会被持久化。

这里有个隐藏陷阱就是for循环结束之后i仍然自增了1。
结果

6

6

6

6

6

11.伪闭包

function foo(){

console.log(a);

}

function bar () {

var a = 3;

foo();

}

var a = 2;

bar();

分析

闭包是函数的嵌套定义,而不是函数的嵌套调用。
结果

2

思考

如何输出3?

function bar () {

function foo(){

console.log(a);

}

var a = 3;

foo();

}

var a = 2;

bar();

12.彩蛋光说不练假把式~
一周月内将下题正确答案发送至我邮箱内(邮箱地址请参考博客),将获得本年度我阅读过最优秀的关于AngularJS的电子书一本。

var Obj = {

name: 'zdl',

do: function(){

console.log(this.name);

}

}

写个对象a继承Obj的方法(不使用new)。

原文作者:亚里士朱德
博客网址:http://yalishizhude.github.io

js问题学习的更多相关文章

  1. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  2. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  3. js入门学习~ 运动应用小例

    要实现的效果如下: 鼠标移入各个小方块,实现对应的效果(变宽,变高,移入透明,移出恢复)~~ (且各运动相互之前不干扰)  主要是练习多个物体的运动框架~~ --------------------- ...

  4. JS入门学习,写一个时钟~

    <!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <t ...

  5. 【干货分享】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  6. js再学习笔记

    #js再学习笔记 ##基本 1.js严格区分大小写   2.js末尾的分号可加,也可不加   3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...

  7. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...

  8. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  9. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

  10. js 正则学习小记之NFA引擎

    原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教. 之前大致有个印象,正 ...

随机推荐

  1. URI--http://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E6%A0%87%E5%BF%97%E7%AC%A6

    维基百科,自由的百科全书     在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识允许用户对网络中( ...

  2. javascript 高级程序设计学习笔记(面向对象的程序设计)继承

    ECMAScript中描述了原型链的概念,原型链是实现继承的主要方法. 实现原型链继承有一种基本模式 function SuperType () { this.property = true; } S ...

  3. 使用ICE进程间通信时,IP和端口的选择

    使用ICE进程间通信时,IP和端口的选择 服务器在创建时使用的Endpint格式为 tcp  -h IP地址 -p 端口 1.IP地址的选择 如果填某个网卡的地址,则只在这个地址上监听,客户端必须连这 ...

  4. 不同css样式适应不同屏幕大小实现自适应宽度

    @media screen and (判断属性){ CSS样式选择器 } 例如: <div class="silder_photo"></div> < ...

  5. jQuery + css 公告从左往右滚动

    $(function() { // 公告滚动 $(".notice-content").textScroll(); }); /** * 从右往左滚动文字 * @returns {u ...

  6. jQuery工具函数上

    1.字符串操作 <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...

  7. python 的内建函数

    lambda 函数:lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值 1. map/reduce 函数 (1)map()函数接收两个参数,一个是函数,一个是序列,map将传入 ...

  8. win8上安装 Pillow

    1.确保正确安装pip(2.7.9默认安装) 2. pip install wheel 3.下载 pillow-*.whl 根据自己的电脑和python版本 地址 4.安装 pip install x ...

  9. ZJUTACM(hd1259)

    ZJUTACM 点我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. KVO的实现原理探寻

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...