下面是代码
/* 定义一个全局变量,通过下面的函数将它的值
作为查询字符串的一部分添加到链接的 - href - 中:
*/
var quantaty = 5;
/* 当给这个函数传递一个链接(作为函数中的参数 - linkRef -)时,
会将一个 onclick 事件处理器指定给该链接,该事件处理器
将全局变量 - quantaty - 的值作为字符串添加到链接的 - href -
属性中,然后返回 true 使该链接在单击后定位到由 - href -
属性包含的查询字符串指定的资源:
*/
function addGlobalQueryOnClick(linkRef){
/* 如果可以将参数 - linkRef - 通过类型转换为 ture
(说明它引用了一个对象):
*/
if(linkRef){
/* 对一个函数表达式求值,并将对该函数对象的引用
指定给这个链接元素的 onclick 事件处理器:
*/
linkRef.onclick = function(){
/* 这个内部函数表达式将查询字符串
添加到附加事件处理器的元素的 - href - 属性中:
*/
this.href += ('?quantaty='+escape(quantaty));
return true;
};
}
}无论什么时候调用 addGlobalQueryOnClick 函数,都会创建一个新的内部函数(通过赋值构成了闭包)。从效率的角度上看,如果只是调用一两次addGlobalQueryOnClick 函数并没有什么大的妨碍,但如果频繁使用该函数,就会导致创建许多截然不同的函数对象(每对内部函数表达式求一次值,就会产生一个新的函数对象)。上面例子中的代码没有关注内部函数在创建它的函数外部可以访问(或者说构成了闭包)这一事实。实际上,同样的效果可以通过另一种方式来完成。即单独地定义一个用于事件处理器的函数,然后将该函数的引用指定给元素的事件处理属性。这样,只需创建一个函数对象,而所有使用相同事件处理器的元素都可以共享对这个函数的引用:/* 定义一个全局变量,通过下面的函数将它的值
作为查询字符串的一部分添加到链接的 - href - 中:
*/
var quantaty = 5;
/* 当把一个链接(作为函数中的参数 - linkRef -)传递给这个函数时,
会给这个链接添加一个 onclick 事件处理器,该事件处理器会
将全局变量 - quantaty - 的值作为查询字符串的一部分添加到
链接的 - href - 中,然后返回 true,以便单击链接时定位到由
作为 - href - 属性值的查询字符串所指定的资源:
*/
function addGlobalQueryOnClick(linkRef){
/* 如果 - linkRef - 参数能够通过类型转换为 true
(说明它引用了一个对象):
*/
if(linkRef){
/* 将一个对全局函数的引用指定给这个链接
的事件处理属性,使函数成为链接元素的事件处理器:
*/
linkRef.onclick = forAddQueryOnClick;
}
}
/* 声明一个全局函数,作为链接元素的事件处理器,
这个函数将一个全局变量的值作为要添加事件处理器的
链接元素的 - href - 值的一部分:
*/
function forAddQueryOnClick(){
this.href += ('?quantaty='+escape(quantaty));
return true;
}
为什么下面这种例子就不会循环创建函数对象?
/* 定义一个全局变量,通过下面的函数将它的值
作为查询字符串的一部分添加到链接的 - href - 中:
*/
var quantaty = 5;
/* 当给这个函数传递一个链接(作为函数中的参数 - linkRef -)时,
会将一个 onclick 事件处理器指定给该链接,该事件处理器
将全局变量 - quantaty - 的值作为字符串添加到链接的 - href -
属性中,然后返回 true 使该链接在单击后定位到由 - href -
属性包含的查询字符串指定的资源:
*/
function addGlobalQueryOnClick(linkRef){
/* 如果可以将参数 - linkRef - 通过类型转换为 ture
(说明它引用了一个对象):
*/
if(linkRef){
/* 对一个函数表达式求值,并将对该函数对象的引用
指定给这个链接元素的 onclick 事件处理器:
*/
linkRef.onclick = function(){
/* 这个内部函数表达式将查询字符串
添加到附加事件处理器的元素的 - href - 属性中:
*/
this.href += ('?quantaty='+escape(quantaty));
return true;
};
}
}无论什么时候调用 addGlobalQueryOnClick 函数,都会创建一个新的内部函数(通过赋值构成了闭包)。从效率的角度上看,如果只是调用一两次addGlobalQueryOnClick 函数并没有什么大的妨碍,但如果频繁使用该函数,就会导致创建许多截然不同的函数对象(每对内部函数表达式求一次值,就会产生一个新的函数对象)。上面例子中的代码没有关注内部函数在创建它的函数外部可以访问(或者说构成了闭包)这一事实。实际上,同样的效果可以通过另一种方式来完成。即单独地定义一个用于事件处理器的函数,然后将该函数的引用指定给元素的事件处理属性。这样,只需创建一个函数对象,而所有使用相同事件处理器的元素都可以共享对这个函数的引用:/* 定义一个全局变量,通过下面的函数将它的值
作为查询字符串的一部分添加到链接的 - href - 中:
*/
var quantaty = 5;
/* 当把一个链接(作为函数中的参数 - linkRef -)传递给这个函数时,
会给这个链接添加一个 onclick 事件处理器,该事件处理器会
将全局变量 - quantaty - 的值作为查询字符串的一部分添加到
链接的 - href - 中,然后返回 true,以便单击链接时定位到由
作为 - href - 属性值的查询字符串所指定的资源:
*/
function addGlobalQueryOnClick(linkRef){
/* 如果 - linkRef - 参数能够通过类型转换为 true
(说明它引用了一个对象):
*/
if(linkRef){
/* 将一个对全局函数的引用指定给这个链接
的事件处理属性,使函数成为链接元素的事件处理器:
*/
linkRef.onclick = forAddQueryOnClick;
}
}
/* 声明一个全局函数,作为链接元素的事件处理器,
这个函数将一个全局变量的值作为要添加事件处理器的
链接元素的 - href - 值的一部分:
*/
function forAddQueryOnClick(){
this.href += ('?quantaty='+escape(quantaty));
return true;
}
为什么下面这种例子就不会循环创建函数对象?
/* 这个内部函数表达式将查询字符串
添加到附加事件处理器的元素的 - href - 属性中:
*/
this.href += ('?quantaty='+escape(quantaty));
return true;
};这个每次ONCLICK一次都会创建一个匿名函数
this.href += ('?quantaty='+escape(quantaty));
return true;
}this 是 window ,需要传参过来