- 函数预编译过程中 this ——》window
- 全局作用域中 this——》window
- call/apply 可以改变函数运行时的this指向
- 谁调用函数,谁就是this
obj.function(){} function()里面的this指向obj
function test(c) {
// var this = Object.create(test.prototype); {
// __proto__: test.prototype;
// }
var a = 123;
function b() {
//sjflkjasdlj
}
}
// ao{
// a : undefined
// b : function(){}
// this : window
// arguement : [1]
// }
test(1);
var name = "222";
var a = {
name: "111",
say: function() {
console.log(this.name);
}
};
var fun = a.say;
fun();
a.say();
var b = {
name: "333",
say: function(fun) {
fun();
}
};
b.say(a.say);
b.say = a.say;
b.say();
不好理解的是第三个;执行b.say()方法,this指的是b,但是a.say是参数,他是一个函数,函数空执行,没有谁调用!属于预编译,this值windows所以与a,b无关!
arguments
- arguments.callee
- function.caller
callee指函数的引用!就是指函数的本身,在初始化工具——立即执行函数中
var jiecheng = (function(i) {
if (i == 1) return i;
return i * jiecheng(i - 1);
})(5);
在这儿,阶乘函数是立即执行函数,里面的想要实现递归,就要调用函数本身!所以就用到了arguments.callee!
var jiecheng = (function(i) {
if (i == 1) return i;
return i * arguments.callee(i - 1);
})(5);
函数自身的属性 demo.caller指在哪个环境调用!
function test() {
demo();
}
function demo() {
console.log(demo.caller);
}
test();
在es5下不能用callee和caller!
做题吧!
var foo = "123";
function print() {
var foo = "456";
this.foo = "789";
console.log(foo);
}
print();
答案:456
var foo = 123;
function print() {
this.foo = 234;
console.log(foo);
}
print();
答案:234
var foo = 123;
function print() {
this.foo = 234;
console.log(foo);
}
new print();
使用new 方法了,那就是print是个构造函数,这是的this指以他的原型创造的对象,要打印的是foo,不是this.foo,所以上go身上找到 —— 123
var a = 5;
function test() {
a = 0;
alert(a);
alert(this.a);
var a;
alert(a);
}
test();
// new test();
0 5 0
0 undefined 0
function print() {
console.log(foo);
var foo = 2;
console.log(foo);
console.log(hello);
}
print();
function print() {
var test;
test();
function test() {
console.log(1);
}
}
print();
答案 :1
function print() {
var x = 1;
if (x == "1") console.log("one!");
if (x === "1") console.log("two!");
}
print();
答案 :one!
var bar = {
a: "002"
};
function print() {
bar.a = "a";
Object.prototype.b = "b";
return function inner() {
console.log(bar.a);
console.log(bar.b);
};
}
print()();
var obj = {
naem: "abc",
age: 123,
sex: "famale"
};
var obj1 = {};
function clone(origin, target) {
for (var prop in origin) {
target[prop] = origin[prop];
}
}
clone(obj, obj1);