未定义(not set)的oracle 缺失set关键字字怎么理解

PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
Javascript是一种很灵活的语言, 而This关键字又是灵活中的灵活, 但是因为它的灵活, 也注定了它的难用.
以前我用this的时候, 都会觉得不踏实, 老是担心它不知道怎么地就会指到另外的什么地方.
其实, 这都是因为,
我们对它的不了解.
刚好最近再给百度学院做《Javascript高级-作用域/原型链》的ppt, 而swit1983网友也刚好提这个问题, 索性就把这部分内容独立总结出来, 与大家分享.
首先, 我先抛出一个定论:”在Javascript中,This关键字永远都指向函数(方法)的所有者”.
首先,让我们看看”函数”:
function introduce() {
alert(&Hello, I am Laruence\r\n&);
对于,这个函数, this关键字指向谁呢?
如我之前的文章所述(), 定义在全局的函数, 函数的所有者就是当前页面, 也就是window对象.
这也就是为什么, 我把函数用引号引起来. 因为定义在全局的函数, 其实也就是window对象的一个方法.
所以,我们即可用通过函数名直接调用, 也可用通过window.方法名来调用, 这个时候, 方法中的this关键字指向它的所有者:window对象.
如果, 我们查看window的introduce属性, 就会得到:
var name = &I am Laruence&;
function introduce() {
alert(this.name);
alert(window.introduce);
* function introduce() {
* alert(this.name);
看了上面的代码, 也许你就会想到既然, 全局函数是window对象的方法, 全局变量是window对象的属性(Javasript作用域中已有述及), 那么,在全局函数中就可用通过this关键字来访问全局变量吧?
答案是肯定的, 如果调用introduce函数, 你就会认识我是Laruence.
事件处理函数
也许, 对于this关键字的迷惑, 绝大部分原因是来自把函数(方法)用在事件处理的时候.
&input id=&name& type=&text&
name=&name& value=&Laruence& /&
比如, 我们现在需要在点击”name”输入框的时候, 显示出name输入框的value. 那么, 可用写下如下代码:
function showValue() {
alert(this.value);
document.getElementById('name').onclick = showV
上面的代码, 运行正常, 但是why? 不是说函数的this指针永远指向函数所有者么? 不是说全局变量的所有者是window对象么?
呵呵, 如果你能想到这个问题, 那说明你在认真的看我的文章, 否则,,我建议你从头看起, 否则看完了,你还是迷糊~
恩, 对, 对于上面的代码, showValue是定义在了全局对象, 那么看来问题只能发生在onclick事件绑定的时候了.
我们知道, 在Js中一切都是对象, 函数和方法也都是对象的属性, 只不过函数有可执行的内部属性. 所以, 对于上面的代码, 在对onclick绑定处理器的时候, 其实是对id为name的输入框Dom对象的onclick属性赋值.
也就是说, 我们把函数showValue Copy 给了name输入框对象的onclick属性. 如果我们查看此时的onclick:
function showValue() {
alert(this.value);
document.getElementById('name').onclick = showV
alert(document.getElementById('name').onclick);
* function showValue() {
* alert(this.value);
所以, 当事件触发的时候, 就会去调用name输入框的onclick方法, 这个时候,this关键字自然就指向的是name输入框了.
但是, 迷惑的事情就来了, 比如下面这种写法:
function showValue() {
alert(this.value);
&input id=&name& type=&text&
name=&name& value=&Laruence&
onclick=&showValue()&/&
就无法正常运行, 这又是为什么呢?
恩, 因为这个时候, 并不是赋值, 而是引用.
如果我们注意俩种onclick的写法, 你会发现, 对于之前的方法, 我们使用的是:
dom.onclick = //没有调用符
而对于刚才的方法:
onclick = &showvalue()& //有调用符
这个也能侧面的反映出俩者的区别:对于前者,是赋值, 而对于后者是引用.
如果我们这个时候查看输入框的onclick属性,我们得到:
alert(dom.onclick);
* function onclick() {
showValue();
看到区别了么?
也就懂得为什么了吧?
讲到这里, 有一个很有趣的例子 ,大家可以在IE下试试:
&img src=&xxx& onerror=&alert(1);} function hi() { alert(2); & /&
改变this的指向
那, 既然我们已经知道为什么了, 那怎么才能让this指向我们想要指的地方呢?
对于上面的事件处理函数来说, 我们可以有如下几种写法:
dom.onclick = showValue();
dom.onclick = function() { alert(this.value) ;}
&input onclick=&alert(this.value);& /& //想想刚才我们的引用,是如何把这句嵌入的.
dom.addEventListener(dom, showValue, false); //ff only
而对于不是事件处理函数的场合, 我们可以使用apply, 或者call, 来改变this关键字的指向.
var laruence = {
name : 'laruence',
position : 'Senior PHP Engineer',
company : 'Baidu.inc'
function introduce() {
alert(this.name);
introduce.call(laruence);
Related Posts:
Tags: , , ,
Leave a Reply
开发组核心成员, 顾问, PHP7主要开发者, , , 等开源项目作者.彻底理解Java中this 关键字
作者:Devin*
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了彻底理解Java中this 关键字的相关资料,非常不错,具有参考价值,需要的朋友可以参考下
this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因
this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄。
怎么理解这段话呢?
thinking in java里面有这么一个例子
有两个同一个类型的对象,分别叫做a和b,那我们怎样区别在调用方法f()的时候,是谁再调用这个方法呢?
class Banana {
void f(int i){
/***方法主体*****/
Banana a = new Banana();//生成Banana的对象a
Banana b= new Banana();//生成Banana的对象b
那么编译器是怎样知道你是要调用哪个对象的f()函数呢?其实幕后的传送应该是:
a.f(1)&&====&&Banana.f(a,1);
b.f(1)&&====&&Banana.f(b,2);
我理解为:生成一个Banana的对象a,调用a的方法f()的时候,会同时生成一个指向这个对象的一个句柄this
这里就是this 这个指向对象 new Banana()或者 this 在这里等价于句柄 a;this《==》a;
当我们在一个方法的内部的时候。并且希望获得当前对象的句柄,由于这个句柄时编译器秘密传递的,所以时没有明确的标志符来识别的,这个时候我们可以使用this这个关键字
this的通俗含义:不论是生成的哪个对象调用了这个方法,都会生成一个指向这个对象的指针 this
thinking in java 里面的经典例子:
public class Leaf{
private int i=0;
Leaf increment(){
void print(){
Systme.out.println("i="+i);
public static void main (String [] args)
Leaf x =new Leaf();
x.increment().increment(). increment().print();
1、生成一个对象的句柄 x ;语法格式为 Leaf x;
2、生成一个Leaf class的对象;语法格式为 new Leaf();
3、建立句柄与对象的联系 ;语法为 x = new Leaf();
4、调用对象 new Leaf()里面的方法 increment();语法为 x.increment()
×××谁调用了方法 increment()呢?是Leaf类的对象x(或者是new Leaf()),所以对应系统会生成一个this 引用,并把它秘密的指向 x 或者是 指向 new Leaf()这个对象,所以 increment()返回的是一个指向x的引用!是一个内存的地址,我们可以把它打印出来看看,就知道了!
以上内容是小编给大家介绍的Java中this 关键字的知识,希望对大家有所帮助!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具首先你要知道在一个类中无论是写入方法还是属性等,肯定是要被外界引用到的(private 等被保护的除外),要是想在类的外部调用方法或是属性,需要一个引用类型指向一个new的对象,如HelloWorld h=new HelloWorld();中的“h”,但是如果你要想再一个类的内部使用该类的方法、属性、构造器等,java提供了一个简单的方法--this关键字。写入一个例子看了就很好理解了。
public class Test01 {
public String str = &test01&;
public String getStr() {
public void setStr(String str) {
// System.out.println(this);
this.str =
public void getInfo(){
System.out.println(this.str);
&/span&&span style=&font-size:14&&public class Test01_main {
public static void main(String [] args){
Test01 t=new Test01();
//在Test01类的内部,调用Test01类中的str属性。
t.getInfo();
//在Test01_main类的中,调用Test01类中的str属性。
System.out.println(t.str);
//对 Test01中的属性进行更改
t.setStr(&new test01&);
//通过Test01类中查看属性
t.getInfo();
//通过外部方法查看s属性
System.out.println(t.str);
new test01
new test01
从上面例子可以看出this 的作用是在类的内部调用本身类的方法或属性。
刚开始是我对于this定义“代表调用该方法对象的引用”一直不理解是怎么回事,看下面小例子
&span style=&font-size:14&&public class Test02 {
public void getInfo(){
System.out.println(this);
public static void main(String []args){
Test02 t=new Test02();
t.getInfo();
System.out.println(t);
&/span&结果:
&span style=&font-size:14&&com.lava.test.Test02@
com.lava.test.Test02@&/span&不多说从结果看出this和引用类型t的打印结果一样。解释了上面所说的一句话。
其实this关健字很好理解,别人的解释也已经很到位了。但是需要注意一下几点:
1、this一般是在方法体中使用。
2、它实现了在类的内部调用该类的方法或属性。
3、在一个构造函数中调用本身的另一个构造函数。
4、当类没有被new是,并不知道this指向的是哪个对象,所以不能与static一起使用,因为被static修饰的方法是随类生成时生成的,不能被new。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:230次
排名:千里之外}

我要回帖

更多关于 黑苹果not yet set 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信