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. Maximum Subarray (JAVA)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. iOS应用之间的跳转与数据传递

    在开发的时候遇到需要从其他APP调用自己的APP的需求,比如从Safari中打开APP,并且传递一些信息的需要 1.首先设置自己的URL types 打开项目中的工程文件,打开info选项,在下面的U ...

  3. BullseyeCoverage:代码覆盖率。

    1,安装和使用步骤 阅读READER文档.并安装(非常简单,README中有详细指令说明) 配置环境:同样可以阅读相关文档. 增加PATH环境变量.需要注意,此路径需要增加在PATH的最前列.即< ...

  4. 如何使用NODEJS+REDIS开发一个消息队列

    作者: RobanLee 原创文章,转载请注明: 萝卜李 http://www.robanlee.com MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应 ...

  5. web.xml中<load-on-start>n</load-on-satrt>作用

    如下面一段配置,我们再熟悉不过了: 我们注意到它里面包含了这段配置:<load-on-startup>1</load-on-startup>,那么这个配置有什么作用呢? 作用如 ...

  6. MYSQL SET类型字段的SQL查询某个字段保函某个值的查询

    1.column set('hot','crazy','smart')  //column字段(set属性)三个值 2.select * from table where FIND_IN_SET('h ...

  7. ng-click得到当前元素,angular.element()用法

    <!DOCTYPE html> <html> <head> <title></title> <script src="lib ...

  8. SSO单点登录(转载)

    昨天和几位朋友探讨到了这个话题,发现虽然单点登录,或者叫做独立的passport登录虽然已经有了很多实现方法,但是能真正了解并实现的人却并不太多,所以些下此文,希望从原理到实现,能让大家了解的多一些 ...

  9. How Many Fibs?

    How Many Fibs? 点我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  10. 九章算法系列(#5 Linked List)-课堂笔记

    前言 又是很长时间才回来发一篇博客,前一个月确实因为杂七杂八的事情影响了很多,现在还是到了大火燃眉毛的时候了,也应该开始继续整理一下算法的思路了.Linked List大家应该是特别熟悉不过的了,因为 ...