javascripts深入了解(三)

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

你可能感兴趣的:(this)