我有这段代码:
var obj=new function(){
this.var=null;
this.fun=function(funVar){
console.log('funVar: ',funVar);
}
console.log('init',this);
this.fun('fun');
};
obj.var='Something';
obj;
在控制台日志中,我有var==null
和var=='something'
:
我不明白发生了什么。
我希望做obj;
这样的事情来启动对象。我知道如何做obj={init:function(){}}
然后使用obj.init()
,我只是在尝试,现在我很好奇。
答案 0 :(得分:0)
简而言之:
函数是JavaScript中的第一类值,就像对象,数组等一样。因此,您可以编写var foo = function(){};
来创建一个新的函数值,并在该函数中放置对该值的引用。变量foo
。与任何函数一样,必须在引用后添加括号以调用函数:
var a = function(){ console.log('hi') };
var b = function(){ console.log('bye') };
var c = a;
a; // does nothing useful. similar to `42;` or `true;` as a statement
a(); // "hi"
c(); // "hi"
b(); // "bye"
console.log(typeof a); // "function"
console.log(a==b); // false
console.log(a==c); // true
b = a;
b(); // "hi"
console.log(a==b); // true
函数值可以在其上放置自定义属性,例如JavaScript对象。例如:
function bar(){
// arguments.callee gives the function value being called
arguments.callee.callCount++;
}
bar.callCount=0; // I just made up a new property!
bar();
bar();
bar();
console.log( bar.callCount ) // 3
当您使用new
关键字在JavaScript中将函数用作构造函数时,运行时(1)会分配一个新对象,(2)运行该函数这个新对象作为this
范围,(3)返回该新对象(不是返回的函数)。
所以:var x = new bar();
创建一个新的空对象,用该bar
范围作为this
范围调用x
函数,然后将该对象的引用放入变量{{1 }}。请注意,此新对象与函数值不同。您可以在不同的对象上使用具有相同名称但值不同的属性:
function jim(){
this.jam = "my jam";
}
jim.jam = "shared jam"; // a custom property on the function
var jm1 = new jim();
var jm2 = new jim();
console.log(jm1.jam); // my jam
console.log(jm2.jam); // my jam
console.log(jim.jam); // shared jam
jm2.jam = "special jam";
console.log(jm1.jam); // my jam
console.log(jm2.jam); // special jam
console.log(jim.jam); // shared jam