论坛首页 Web前端技术论坛

学习Validation验证框架中的问题之一

浏览 3367 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-01  
在Validation验证初始化的时候,代码中有这么段代码:


Validation.prototype = {
	initialize : function(form, options){
		this.options = Object.extend({
			onSubmit : true,
			stopOnFirst : false,
			immediate : false,
			focusOnError : true,
			useTitles : false,
			onFormValidate : function(result, form) {},
			onElementValidate : function(result, elm) {}
		}, options || {});
		this.form = $(form);
		var id =  Validation.getElmID(this.form);
		Validation.validations[id] = this;
	
		if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		if(this.options.immediate) {
			var useTitles = this.options.useTitles;
			var callback = this.options.onElementValidate;
			Form.getElements(this.form).each(function(input) { // Thanks Mike!
				Event.observe(input, 'blur', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback}); });
			});
		}
	},
	onSubmit :  function(ev){
		if(!this.validate()) Event.stop(ev);
	},



其中Event.observe(this.form,'submit',this.onSubmit.bind(this),false);这句中的this.onSubmit.bind(this)不解,为什么要绑定this呢,this.onSubmit不行吗?


为了解决疑问,进行简单test:



		<script src="prototype.js" type="text/javascript"></script>

	
<script type="text/javascript">
	
				var Validation = Class.create();
		
          Validation.prototype = {
            initialize:function(btn){
            
            alert("init");
            
           this.btn = btn;
//重点的一段代码
        Event.observe(this.btn,'click',this.onClick,false);
//下边同样可以运行
 // Event.observe(this.btn,'click',this.onClick.bind(this),false);
            
            },
            
        onClick:function(){alert("onclick");}
          
      
           };		
   	</script>

	</head>

<body>
<input type="button" name="aa" id="aaid" value="测试" />

	
		<script type="text/javascript">
		var val = new Validation('aaid');
		
		</script>

	</body>
</html>


为什么这段代码可以,而我去掉Validation 中的bind(this)就不行呢?
   发表时间:2007-11-01  
有个东西叫context,它还可以随着函数调用方式不同变化,还有个东西叫wrapper,它可以强制改变context,保持你想保留的context
0 请登录后投票
   发表时间:2007-11-01  
afcn0 写道
有个东西叫context,它还可以随着函数调用方式不同变化,还有个东西叫wrapper,它可以强制改变context,保持你想保留的context


还是不明白,它的本意不是给需要验证的form绑定一个onSubmit方法吗,this的context不就是Validation本身吗?
0 请登录后投票
   发表时间:2007-11-01  
再教学一下
test={aa:123,bb:function(){alert(this.aa)}}
b=test.bb;
c=test.bb.bind(test);
test.bb();
b();
c();

还不明白,那就.........
0 请登录后投票
   发表时间:2007-11-01  
this就当是句子中的主语.
0 请登录后投票
   发表时间:2007-11-01  
afcn0 写道

 
           test={
          
           aa:123,
           bb:function(){
          
           alert(this.aa)
           }
           };  
  b=test.bb;  
  c=test.bb.bind(test);  
test.bb();  
   b();  
  c();  


大概明白了,可不可这样理解,把某个方法bind到一个对象上之后,对改方法的调用对象将一直是绑定的对象。
0 请登录后投票
   发表时间:2007-11-01  
引用
在function(){}中引入this是一个动态的变量。谁去调就指向谁。

http://www.iteye.com/topic/24457?page=2
0 请登录后投票
   发表时间:2007-11-01  
sp42 写道
引用
在function(){}中引入this是一个动态的变量。谁去调就指向谁。

http://www.iteye.com/topic/24457?page=2


引用
说句真心话,其实js就这么几回事,只不过对JS混淆视听的东西太多,而且最重要的是没有所谓的offical guide那里要命!


感触很深,我希望能把javascript基础打好,所以看了很多关于闭包,上下文,什么面向对象和继承的模拟等文章,发现越看脑袋越乱。
同一个概念和问题,有不同的观点和看法,谁也说服不了谁,但是又很少有能彻底说清楚和明白的人,反而是看了几篇翻译的文章后才有点条理。学好javascript,真的很难吗?迷茫中.....
0 请登录后投票
   发表时间:2007-11-01  
呵呵 这也难怪...JS混合太多东东...变得有点...禅了...
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics