/** *这是错误的语法; *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; }