/**
*这是错误的语法;
*myfun使用了函数声明的语法定义,而不是函数表达式语法。
*可以将函数作为一个操作数传递给分组运算符,从而修正这一错误.我们需要做的只是将函数包含到圆括号中
*/
function myfun(){
return 1;
}();
/**
*在这个例子中,函数不再位于主程序代码中,而是做为一个操作数传递给一个分组运算符(),它直接返回该函数。这将函数
*声明转换成了函数表达式,并且后面的()执行该函数,函数声明是不能作为操作数的,因此,解释器消除了该语法的歧义,
*并且将这个函数当作一个函数表达式对待。
*/
(function myfun(){
return 1;
})();
/**
* 当你使用new运算符调用一个函数的时候,它总是返回一个对象。在函数体内部,这个对象成为this。如果不使用new调用的话,没有显示
* 的return语句的函数,都会返回undefined;
* :this对象在函数返回的时候被销毁了
*/
function myfun() {
return json = {
name: 'javascript'
};
this.gender = 'sql';
}
var obj = new myfun();
console.log(obj.gender);//undefined
console.log(obj.name);//'javascript'
/**
* 当使用new时,你可以返回一个定制的对象,比如上面的例子(而不是this),但是它必须是一个对象。尝试返回一个非对象,将会导致
* 返回值被忽略,并且你最终仍然会得到this。
*/
function myfun() {
return json = {
name: 'javascript'
};
this.gender = 'sql';
return 1;
}
var obj = new myfun();
console.log(obj.gender);//undefined
console.log(obj.name);//'javascript'
/**
* 在应该使用new的地方一定要使用new
* 该例子中省略了new意味着这是一次常规的函数调用,并且现在的this指向了全局对象。添加给该
* 全局对象的属性,可以用作全局变量
*/
function myfun(){
this.thename='fh';
return 1;
}
var obj=myfun();
obj.thename //undefined
thename//'fh'
/**
* 如果调用的时候忘记了new,使函数也能想构造器函数一样工作
*/
function Myfun(){
if(!(this instanceof Myfun))
{
return new Myfun();
}
this.thename='fh';
return 1;
}