for(var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
});
}
for(var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
});
})(i);
}
结果:
5
5
5
5
5
0
1
2
3
4
setTimeOut()会在所有可执行函数执行后在执行。
匿名函数会立即执行。
function foo1() {
var value = 1 +
1
return value;
}
//JS中如果一个语句以[(/+-开头,就有可能和上一句加在一起解析
function foo2() {
return
{
bar: 'hello'
};
}
//return 后会自动添加分号,不管下一条语句是什么
console.log(foo1());
console.log(foo2());
结果:
2
undefined
(function() {
var a=b= 3 ;
})();
//a是局部变量,匿名函数运行完毕直接销毁,b声明为全局变量,会一直存在。
console.log("a defined? " + (typeof a !== 'undefined'));
console.log("b defined? " + (typeof b !== 'undefined'));
console.log(b);
console.log(typeof a);
结果:
a defined? false
b defined? true
3
undefined
var object = {
foo: "bar",
func: function() {
var self = this;
console.log(this);
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: this.foo = " + self.foo);
(function() {
console.log("inner func: this.foo = " + global.foo);
console.log("inner func: this.foo = " + self.foo);
})();
}
};
//global 是 javascript 运行时所在宿主环境提供的全局对象,是一个 Object。目前来说最常见的宿主环境是浏览器和 nodejs,浏览器暴露了一系列操作 DOM, Location, History 等 Api 供 Js 调用(即 window 对象)而 nodejs 里则没有浏览器里的 DOM 等,可以运行 for (var i in global){console.log(i)} 查看这个全局对象提供的方法,如 process, buffer 这些 nodejs 的资源。
//匿名函数的this指的是global对象(nodejs环境下)浏览器环境下就是window对象
object.func();
结果:
{ foo: 'bar', func: [Function: func] }
outer func: this.foo = bar
outer func: this.foo = bar
inner func: this.foo = undefined
inner func: this.foo = bar
var scope = "global";
function func() {
console.log(scope);
var scope = "local";
}
//变量提升 undefined
func();
console.log((function f(n) { return ((n > 1) ? n * f(n-1) : n); })(10));
//阶乘 匿名函数
//结果是10的阶乘的结果
console.log((function (n) {
return n;
})(8))
//匿名函数 第二个括号是函数参数
console.log("1" + 1); //字符前加+ -会把它变成number类型
console.log(1 + "2" + "2"); //122
console.log(1 + +"2" + "2"); //32
console.log(1 + -"1" + "2"); //02
console.log(+"1" + "1" + "2"); //112
console.log("A" - "B" + "2"); //NaN2
console.log("A" - "B" + 2); //NaN +2 还是NaN
console.log("A" - "B"); //NaN
//JS在进行这种运算时 仅仅会在2个值相加时优先推断为string类型 其它情况下(比如“-”。“*”。“/”)都默觉得number型运算。
//判断一个方法是不是数组
//方法一
function isArray(obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
}
//方法二
function isArray(obj) {
return obj.__proto__ === Array.prototype;
}
//方法三(ES5)
Array.isArray(obj);
function Example() {
getName = function() { console.log(1); };
return this;
}
Example.getName = function() { console.log(2); };
Example.prototype.getName = function() { console.log(3); };
console.log(typeof Example); //function
console.log(typeof Example()); //object
Example.getName(); //函数的方法
Example().getName(); //对象的方法
new Example.getName(); //new 一个函数的方法 结果还是2
new Example().getName(); //原型对象方法,实例共享时使用
结果:
function
object
2
1
2
3