JS大牛们请进,很疑惑的有关问题等待中。
JS大牛们请进,很疑惑的问题等待中。。。
f3,f4,f5 是运行了三次obj方法分别得到的返回值,这三个值是不同的,因为每次运行obj,obj方法都产生了一个新的域(scope),所以每次返回的 MyFunc 都是这个新产生的域下的MyFunc,f3 f4 f5 分别对应三个域下的MyFunc
这个obj相当于上一个的obj方法的返回值,所以f3 f4 f5 代表相同的MyFunc
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
第二个,return function 相当于 return new Function,
能再说清楚点吗?这句话什么意思啊?
我能隐约感觉到你要表达的意思,但还是不很明朗,请大侠再赐教。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
恍然大悟,豁然开朗,谢谢大神。
function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
你说的这句话,能不能解释下呢?我的理解是一个语句,一个是表达式,表达式可以在实例化之前就能调用,而语句必须在声明后才能调用。请问你说的差别是不是这点?
当然对于基本类型,new创建和直接创建差别很大的.
还有这句话,能不能解释下?差别在何处?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
恍然大悟,豁然开朗,谢谢大神。
function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
你说的这句话,能不能解释下呢?我的理解是一个语句,一个是表达式,表达式可以在实例化之前就能调用,而语句必须在声明后才能调用。请问你说的差别是不是这点?
当然对于基本类型,new创建和直接创建差别很大的.
还有这句话,能不能解释下?差别在何处?
头一个问题你说的没错,不管叫语句还是叫什么的吧.function(){}这种,只要在当前<script>块的任何位置定义过,就可以在任何位置调用,包括这句话之前.而var foo = function(){};这种,调用要在赋值的后边.. 这是个比较重要的区别,
再细微的差别,包括各浏览器,各脚本引擎实现上的不同,还是有,就不是一两句话能说清了.也包括s = "a" 和 s = new String("a")的差别.这些看看书吧.犀牛或者JS高级编程.
不烦英文的话推荐http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 这系列文章.
请看代码:
【1:】
var obj=function() { var MyFunc=function() { alert("hello world"); } return function() { return MyFunc(); } } var f3=obj(); var f4=obj(); alert(f3.toString()===f4.toString());//true
【2:】
var obj=function() { var MyFunc=function() { alert("hello world"); } return function() { return MyFunc(); } } var f3=obj(); var f4=obj(); alert(f3==f4);//false(连等于都为false,严格等于更为false)
【3:】
var obj=function() { var MyFunc=function() { alert("hello world"); } return function() { return MyFunc(); } }() var f3=obj; var f4=obj; alert(f3===f4);//true
请问各位大牛,怎么解释?
1 楼
refinement_code
2011-04-25
var obj=function() { var MyFunc=function() { alert("hello world"); } return function() { return MyFunc(); } } var f3=obj(); var f4=obj(); var f5=obj();
f3,f4,f5 是运行了三次obj方法分别得到的返回值,这三个值是不同的,因为每次运行obj,obj方法都产生了一个新的域(scope),所以每次返回的 MyFunc 都是这个新产生的域下的MyFunc,f3 f4 f5 分别对应三个域下的MyFunc
var obj=function() { var MyFunc=function() { alert("hello world"); } return function() { return MyFunc(); } }() var f3=obj; var f4=obj; var f5=obj;
这个obj相当于上一个的obj方法的返回值,所以f3 f4 f5 代表相同的MyFunc
2 楼
limu
2011-04-25
第一个,toString()返回的是字符串,只要字符串内容相等,即便在内存中有2份,那也是全等.
第二个,return function 相当于 return new Function看到new了? 每个new都会新生成一个对象,占用一块内存,所以f3 != f4
第三个,f3 === obj === f4 指向一块内存.
第二个,return function 相当于 return new Function看到new了? 每个new都会新生成一个对象,占用一块内存,所以f3 != f4
第三个,f3 === obj === f4 指向一块内存.
3 楼
北极的。鱼
2011-04-25
limu 写道
第一个,toString()返回的是字符串,只要字符串内容相等,即便在内存中有2份,那也是全等.
第二个,return function 相当于 return new Function看到new了? 每个new都会新生成一个对象,占用一块内存,所以f3 != f4
第三个,f3 === obj === f4 指向一块内存.
第二个,return function 相当于 return new Function看到new了? 每个new都会新生成一个对象,占用一块内存,所以f3 != f4
第三个,f3 === obj === f4 指向一块内存.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
第二个,return function 相当于 return new Function,
能再说清楚点吗?这句话什么意思啊?
我能隐约感觉到你要表达的意思,但还是不很明朗,请大侠再赐教。
4 楼
limu
2011-04-25
首先var foo = new bar(); 前边有个new,这就相当于按照bar()的指引生成了一个新对象,新对象就会占用一块新的内存以存储.
所以再来一句var foo2 = new bar(); 那么foo2和foo是两个对象,占了两块内存.那么一般情况下 foo和foo2不会相等 更不会全等.
如果能理解这个,接下来再需要搞清楚几种隐藏的new的生成对象方法.
比如 foo = {} 这句话相当于 foo = new Object();
那么 再来一句:foo2 = {} 自然有foo != foo2
接下来 foo = [] 相当于 foo = new Array();
function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
相当于
var foo = new Function("alert(1)");
如果有个foo2,当然也是不等于foo的.
所以说对象,数组,函数的定义,写法上隐去了new,但是实际上和new一样,是生成了新的对象,在内存中占了新的地方的..
在你的代码中
return function(){}
就相当于
var foo = new Function(){};
return foo;
你的obj调用两次,那么上面这段话执行2次,就new了两次,占了两块地儿,就是俩东西,不等,不全等.
所以再来一句var foo2 = new bar(); 那么foo2和foo是两个对象,占了两块内存.那么一般情况下 foo和foo2不会相等 更不会全等.
如果能理解这个,接下来再需要搞清楚几种隐藏的new的生成对象方法.
比如 foo = {} 这句话相当于 foo = new Object();
那么 再来一句:foo2 = {} 自然有foo != foo2
接下来 foo = [] 相当于 foo = new Array();
function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
相当于
var foo = new Function("alert(1)");
如果有个foo2,当然也是不等于foo的.
所以说对象,数组,函数的定义,写法上隐去了new,但是实际上和new一样,是生成了新的对象,在内存中占了新的地方的..
在你的代码中
return function(){}
就相当于
var foo = new Function(){};
return foo;
你的obj调用两次,那么上面这段话执行2次,就new了两次,占了两块地儿,就是俩东西,不等,不全等.
5 楼
limu
2011-04-25
当然对于基本类型,new创建和直接创建差别很大的.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
6 楼
北极的。鱼
2011-04-26
limu 写道
当然对于基本类型,new创建和直接创建差别很大的.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
恍然大悟,豁然开朗,谢谢大神。
function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
你说的这句话,能不能解释下呢?我的理解是一个语句,一个是表达式,表达式可以在实例化之前就能调用,而语句必须在声明后才能调用。请问你说的差别是不是这点?
当然对于基本类型,new创建和直接创建差别很大的.
还有这句话,能不能解释下?差别在何处?
7 楼
limu
2011-04-26
北极的。鱼 写道
limu 写道
当然对于基本类型,new创建和直接创建差别很大的.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
恍然大悟,豁然开朗,谢谢大神。
function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
你说的这句话,能不能解释下呢?我的理解是一个语句,一个是表达式,表达式可以在实例化之前就能调用,而语句必须在声明后才能调用。请问你说的差别是不是这点?
当然对于基本类型,new创建和直接创建差别很大的.
还有这句话,能不能解释下?差别在何处?
头一个问题你说的没错,不管叫语句还是叫什么的吧.function(){}这种,只要在当前<script>块的任何位置定义过,就可以在任何位置调用,包括这句话之前.而var foo = function(){};这种,调用要在赋值的后边.. 这是个比较重要的区别,
再细微的差别,包括各浏览器,各脚本引擎实现上的不同,还是有,就不是一两句话能说清了.也包括s = "a" 和 s = new String("a")的差别.这些看看书吧.犀牛或者JS高级编程.
不烦英文的话推荐http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 这系列文章.