- 浏览: 162000 次
- 性别:
- 来自: 北京
最新评论
-
BlueAeri:
好像旧了,有些参数没有,比如 --cups
VBoxManage命令详解 -
jiamb:
非常感谢!
学习ibatis的一些资料 -
memory_in_08:
正急着找ibatis的此资料呢,3k you..
学习ibatis的一些资料 -
小猪笨笨:
多谢···
学习ibatis的一些资料 -
mingxiao2010:
谢谢你的分享!!
学习ibatis的一些资料
http://www.cnblogs.com/lhb25/archive/2009/03/12/1409241.html
一次又一次的,
我发现,
那些有bug
的Javascript
代码是 由于没有真正理解Javascript
函数是如何工作而导致的(
顺便说一下,
许多那样的代码是我写的).JavaScript
拥有函数式编程的特性,
当我们选择面对它的时候,
这将成为我们前进的阻碍.
作为初学者,
我们来测试五种函数调用的方法,
从表面来看我们会认为那些函数与C#
中函数 的作用非常相似,
但是我们一会儿可以看到还是有非常重要的不同的地方的,
忽视这些差异无疑会导致难于跟踪的bug
。首先让我们创建一个简单的函数,
这个函 数将在将在下文中使用,
这个函数仅仅返回当前的this
的值和两个提供的参数.
<script type="text/
javascript
">
function
makeArray(arg1,
arg2){
return [ this, arg1, arg2 ];
}
</script>
最常用的方法,
但不幸的,
全局的函数调用
当我们学习Javascript
时,我们了解到如何用上面示例中的语法来定义函数。
,
我们也知道调用这个函数非常的简单,
我们需要做的仅仅是:
makeArray('one', 'two');
// => [ window, 'one', 'two' ]
Wait a minute. What's that window
alert( typeof window.methodThatDoesntExist );
// => undefined
alert( typeof window.makeArray);
// =>
window.makeArray('one', 'two');
// => [ window, 'one', 'two' ]
我说最普遍的调用方法是不幸的是因为它导致我们声明的函数默认是全局的.
我们都知道全局成员不是编程的最佳实践.
这在JavaScript
里是特别的正确,
在JavaScript
中避免使用全局的成员,
你是不会为之后悔的.
JavaScript 函数调用规则1
在没有通过明确所有者对象而直接调用的函数中,如myFunction() ,将导致this 的值成为默认对象(浏览器中的窗口)。
函数调用
让我们现在创建一个简单的对象,
使用 makeArray
函数作为它的一个方法,
我们将使用json
的方式来声明一个对象,
我们也来调用这个方法
//creating the object
var arrayMaker = {
someProperty: 'some value here',
make: makeArray
};
//invoke the make() method
arrayMaker.make('one', 'two');
// => [ arrayMaker, 'one', 'two' ]
// alternative syntax, using square brackets
arrayMaker['make']('one', 'two');
// => [ arrayMaker, 'one', 'two' ]
看 到这里的不同了吧,this
的值变成了对象本身.
你可能会疑问原始的函数定义并没有改变,
为何它不是window
了呢.
好吧,
这就是函数在 JSavacript
中传递的方式,
函数在JavaScript
里是一个标准的数据类型,
确切的说是一个对象.
你可以传递它们或者复制他们.
就好像整个函 数连带参数列表和函数体都被复制,
且被分配给了 arrayMaker
里的属性make,
那就好像这样定义一个 arrayMaker:
var arrayMaker = {
someProperty: 'some value here',
make: function
(arg1, arg2) {
return [ this, arg1, arg2 ];
}
};
JavaScript
函数调用规则2
在一个使用方法调用语法,
像
obj.myFunction()
或者 obj['myFunction'](),
这时this
的值为obj
这是事件处理代码中bug
的主要源头,
看看这些例子
<input type="button" value="Button 1"
id="btn1" />
<input type="button" value="Button 2"
id="btn2" />
<input type="button" value="Button 3" id="btn3"
onclick="buttonClicked();"/>
<script type="text/javascript
">
function
buttonClicked(){
var text = (this === window) ? 'window' : this.id;
alert( text );
}
var button1 = document.getElementById('btn1');
var button2 = document.getElementById('btn2');
button1.onclick = buttonClicked;
button2.onclick = function
(){
buttonClicked(); };
</script>
点 击第一个按钮将会显示”btn”
因为它是一个方法调用,this
为所属的对象(
按钮元素)
点击第二个按钮将显示”window”
因为 buttonClicked
是被直接调用的(
不像 obj.buttonClicked().)
这和我们第三个按钮,
将事件处理函数直接放在标签里是一样的.
所以点击第三个按钮的结果是和第二个一样的.
使用像jQuery
的JS
库有这样的优点,
当在jQuery
里定义了一个事件处理函数,JS
库会帮助重写this
的值以保证它包含了当前事件源元素的引用,
//
使用jQuery
$('#btn1').click( function
()
{
alert( this.id ); // jQuery ensures 'this' will be the button
});
jQuery
是如何重载this
的值的呢?
继续阅读
另外两个:apply()
和call()
你 越多的使用JavaScript
的函数,
你就越多的发现你需要传递函数并在不同的上下文里调用他们,
就像Qjuery
在事件处理函数里所做的一样,
你往往 经常需要重置this
的值.
记住我告诉你的,
在Javascript
中函数也是对象,
函数对象包含一些预定义的方法,
其中有两个便是apply()
和
call(),
我们可以使用它们来对this
进行重置.
var gasGuzzler = { year: 2008, model: 'Dodge Bailout' };
makeArray.apply( gasGuzzler, [ 'one', 'two' ] );
// => [ gasGuzzler, 'one' , 'two' ]
makeArray.call( gasGuzzler, 'one', 'two' );
// => [ gasGuzzler, 'one' , 'two' ]
这两个方法是相似的,
不同的是后面的参数的不同,Function.apply()
是使用一个数组来传递给函数的,
而Function.call()
是将这些参数独立传递的,
在实践中你会发现apply()
在大多数情况下更方便.
JSavacript
函数调用规则3
如果我们想在不复制函数到一个方法而想重载this
的值的时候,
我们可以使用 myFunction.apply( obj )
或 myFunction.call( obj ).
构造器
我不想深入研究在Javascript
中类型的定义,
但是在此刻我们需要知道在Javascript
中没有类,
而且任何一个自定义的类型需要一个初始化函数,
使用原型对象(
作为初始化函数的一个属性)
定义你的类型也是一个不错的主义,
让我们来创建一个简单的类型
//
声明一个构造器
function
ArrayMaker(arg1, arg2) {
this.someProperty = 'whatever';
this.theArray = [ this, arg1, arg2 ];
}
//
声明实例化方法
ArrayMaker.prototype = {
someMethod: function
() {
alert( 'someMethod called');
},
getArray: function
() {
return this.theArray;
}
};
var am = new ArrayMaker( 'one', 'two' );
var other = new ArrayMaker( 'first', 'second' );
am.getArray();
// => [ am, 'one' , 'two' ]
一 个非常重要并值得注意的是出现在函数调用前面的new
运算符,
没有那个,
你的函数就像全局函数一样,
且我们创建的那些属性都将是创建在全局对象上 (window),
而你并不想那样,
另一个话题是,
因为在你的构造器里没有返回值,
所以如果你忘记使用new
运算符,
将导致你的一些变量被赋值为
undefined.
因为这个原因,
构造器函数以大写字母开头是一个好的习惯,
这可以作为一个提醒,
让你在调用的时候不要忘记前面的new
运算符.
带着这样的小心,
初始化函数里的代码和你在其他语言里写的初始化函数是相似的.this
的值将是你将创建的对象.
Javascript
函数调用规则4
当你将函数用作初始化函数的时候, 像MyFunction(),Javascript 的运行时将把this 的值指定为新建的对象.
总结
我希望理解各种函数调用方式的不同会使你的Sjavacript
代码远离bugs,
有些这样的bug
会确保你总是知道this
的值是避免他们第一步
function
所有的这些意味着我们之前调用 makeArray
的方法是和下面调用的方法一样的
object
doing there? Why
is it the value of this? If you haven't stopped to think about it, please stay
with me here.
等一等,
那个Window
对象在这里干嘛呢,
为何this
的值是它呢,
如果你以前没有停下来思考这个问题,
那么请和我一起来分析吧,
在 Javascript
里,
我没有指特定的浏览器,
有一个全局的对象,
那些看起来散落在你的脚本里的每一行代码(
例如在一个对象外的声明)
其实都被写在了一个全局对象的上下文里.
在我们的例子中,
其实那个makeArray
函数可以说不是一个松散的全局函数,
而是全局对象的一个方法,
让我们返回来看浏览器,
在这个环境里它的全局对象被映射到window
对象.
让我们来证明一下:
发表评论
-
svn keywords
2010-11-10 09:58 756Keyword Substitution ... -
(转载)memcached命令
2010-05-14 16:40 2644命令行查看Memcached运行状态 很多时候需要监控服务器 ... -
( 转载)如何用Sysctl调整Linux操作系统的性能
2010-02-01 14:17 1162Sysctl是一个允许您改变正在运行中的Linux系统的接口。 ... -
linux tcp 连接的配置
2009-12-14 10:46 4480tcp_syn_retries :INTEGER默认值是5对于 ... -
给VirtualBox的linux系统共享window的目录
2009-07-21 16:46 2502VirtualBox上装了Ubuntu8, 那么如何共享Vis ... -
linux服务器优化调优笔记
2009-07-20 18:40 1895++不使用atime属性,例需为/data设置notime,可 ... -
减少Linux下服务器的TIME_WAIT套接字数量
2009-07-20 18:25 1452Squid是一种用来缓冲Internet数据的软件。它是这样实 ... -
自我评价表
2009-06-28 21:48 10381。技能检验 编程技能 ... -
vim 格式化
2009-06-26 10:22 1387"""""& ... -
设置ubuntu不启动图形界面
2009-06-22 18:03 17321.安装 rcconf 2.执行 rcconf 命令 3. ... -
简单的 vim 配置(转)
2009-06-18 10:45 895简单的 vim 配置(转)2008-02-20 19:37在终 ... -
memcached 安装日志
2009-05-19 17:08 7761、下载memcached-1.2.1.tar.gz和libe ... -
限制Apache并发连接数
2009-04-27 20:17 1939限制Apache并发连接数 大型动态系统中,如果客户端不顾 ... -
双机集群(HA)系统
2009-04-27 11:36 1279双机集群(HA)系统 LATCH HA ... -
eclipse 反编译插件
2009-03-12 20:30 745下载附件查看 -
在 MyEclipse 5.1GA 上使用 XFire 编写 Web Service
2009-02-13 15:05 1641注:本文对于在MyEclipse 下使用xfire帮助很大,个 ... -
Squid是什么?
2009-02-11 10:15 28471.Squid是什么? S ... -
Memcache是什么
2009-02-11 10:09 1264Memcache是什么Memcache是danga.com的一 ... -
VBoxManage命令详解
2008-12-24 17:04 11316VBoxManage命令详解 本人对vboxmange命令按我 ... -
如何实现eclipse中代码自动提示功能
2008-11-11 13:54 1656eclipse版本3.0时就已经支持代码提示功能,以前使用在 ...
相关推荐
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
标题“javascript调用delphi中的函数”涉及到的技术领域是跨语言通信,具体是JavaScript与Delphi之间的交互。这种交互通常发生在Web应用程序与桌面应用程序的集成,或者在浏览器扩展和本地资源之间。以下是对这一...
为了实现这一功能,我们可以通过几种方法来完成函数的动态调用,本篇将重点介绍使用字符串来动态调用函数的方法,并结合示例来展示相关技巧。 首先,我们需要理解,在JavaScript中,函数是一等公民,这意味着函数...
### 网页脚本(JavaScript)调用VB函数的另类方法 #### 方法概述 在常规场景下,想要从网页脚本(如JavaScript)调用VB程序中的函数,通常会涉及COM对象、ActiveX控件等技术,并可能需要通过`IDocHostUIHandler`...
-- JavaScript调用VBScript函数 --> document.write(FormatValue(1234.56)) ``` 然而,这种直接在HTML中嵌入VBScript的做法在安全性方面存在隐患,并且在现代Web开发实践中不推荐使用。 ### 数组转换:VBScript...
一个在HTML中使用Javascript的window.external调用C#内函数的示例程序。该方法可应用于网页程序开发中的网页-程序沟通,例如用C#的IHTMLWindow2.execScript替换HTML默认Javascript方法使其直接与C#传参、通讯。
本文实例讲述了JavaScript实现同时调用多个函数的方法。分享给大家供大家参考,具体如下: 这里分析JavaScript 同时调用同一网页内的多个函数的实现方法,点击按钮后执行多次函数,比如连续弹出多次窗口。 具体代码...
JavaScript,调用函数的5种方法 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性, 当我们...
JavaScript 函数有 4 种调用方式。 每种方式的不同方式在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 Note 注意 this 是保留关键字,你不能修改 this 的值。 调用 ...
在javascript函数中调用com组件的属性和方法 在JavaScript函数中调用COM组件的属性和方法是指在JavaScript代码中使用COM组件提供的属性和方法来实现各种功能。本文将介绍如何在JavaScript函数中调用COM组件的属性和...
在JavaScript中,函数是一等公民...学会使用上下文调用函数 一、函数调用形式 函数调用形式是最常见的形式,也是最好理解的形式。所谓函数形式就是一般声明函数后直接调用即是。例如: 代码如下:// 声明一个函数,并调
总结,JavaScript调用C++函数涉及到语言间通信的复杂性,但通过ActiveX控件、NPAPI插件或现代的WebAssembly技术,我们可以实现这种交互。在MFC环境下,ActiveX控件是最常见的解决方案,它提供了在JavaScript和C++...
2. **JavaScript调用QT函数**: - 在QT中定义一个槽函数,例如`handleJsCall`,然后使用`QWebChannel`来创建一个通信通道,让JavaScript可以调用这个槽函数。 - 首先,创建一个继承自`QObject`的C++类,暴露槽函数...
使用 `new` 关键字调用函数时,会创建一个新的对象实例,并将这个新对象绑定到 `this`。构造函数主要用于初始化新创建的对象。 ```javascript function Person(name) { this.name = name; } let person = new ...
3. **构造器调用模式**:通过 `new` 关键字调用函数,如 `new Func()`. 这会创建一个新对象,其原型链指向函数的原型(`Func.prototype`),并且 `this` 指向新创建的对象。 4. **apply/call调用模式**:这两个方法...
`call()`和`apply()`是预定义的函数方法,允许我们改变`this`的值并立即调用函数。这两个方法的第一个参数是要绑定的`this`值,后续参数可以是单独的参数列表或数组。例如: ```javascript function myFunction(a,...
要从C++调用JavaScript函数,可以使用`QWebView`的`page()->mainFrame()`方法获取`QWebFrame`对象,然后调用其`evaluateJavaScript()`函数。例如,如果你有一个名为`myJSFunction`的JavaScript函数,可以这样调用:...
如果需要在WebView中启用JavaScript调用Android代码的功能,还要在addJavascriptInterface()方法中声明一个Java类的实例,并为其指定一个可以在JavaScript中访问的接口名字。 在Java代码中定义一个内部类,用于接收...
本文将深入探讨如何利用CEFSharp实现JavaScript调用C#方法,并获取返回的参数。 首先,理解CEFSharp的工作原理至关重要。CEFSharp是Chromium Embedded Framework(CEF)的.NET封装,而CEF是一个开源项目,用于在...