前言
为了node.js做准备,js的基本功还是很重要的。所以正值1024程序员节的时候所以找了些题目,整理了一下知识点。这篇文章感觉代码太多,难免枯燥,所以文章最后留了个 彩蛋给读者。
简单回调
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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指向函数 执行时的当前对象,而非声明环境有。
执行doFoo的时候执行环境就是doFoo函数,执行环境为全局。
执行doFoo2时是在对象内部调用函数,this指针指向该对象。
结果
1 2 |
I'm an a 2 |
用apply改变函数作用域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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); console.log(b); |
分析
apply、call、bind都有个作用就是改变作用域,这里用apply将foo函数的作用域指向obj对象,同时传入参数。
再简单分析一下bind函数内部的嵌套,执行bind函数的时候返回的是一个匿名函数,所以执行bar(3)的时候实际上是执行的bind内部的匿名函数,返回的是之前传入的foo函数的执行结果。
函数没有返回值的情况下默认返回undefined。
结果
1 2 3 |
2 3 undefined |
new关键字
1 2 3 4 5 6 |
function foo(a,b){ this.val = a+b; } var bar = foo.bind(null, 'p1'); var baz = new bar('p2'); console.log(baz.val); |
分析
bind函数的第一个参数为null代表作用域不变,后面的不定参数将会和函数本身的参数按次序进行绑定,绑定之后执行函数只能从未绑定的参数开始传值。
结果
1 2 |
p1p2 |
自执行函数
"前言">前言
为了node.js做准备,js的基本功还是很重要的。所以正值1024程序员节的时候所以找了些题目,整理了一下知识点。这篇文章感觉代码太多,难免枯燥,所以文章最后留了个 彩蛋给读者。 简单回调代码
分析在Javascript中,this指向函数 执行时的当前对象,而非声明环境有。 结果
用apply改变函数作用域
分析apply、call、bind都有个作用就是改变作用域,这里用apply将foo函数的作用域指向obj对象,同时传入参数。 结果
new关键字
分析bind函数的第一个参数为null代表作用域不变,后面的不定参数将会和函数本身的参数按次序进行绑定,绑定之后执行函数只能从未绑定的参数开始传值。 结果
自执行函数
|