GVKun编程网logo

react闲谈——JavaScript语法this全解(react中this)

12

对于想了解react闲谈——JavaScript语法this全解的读者,本文将提供新的信息,我们将详细介绍react中this,并且为您提供关于9个javascript语法高亮插件推荐_javascr

对于想了解react闲谈——JavaScript语法this全解的读者,本文将提供新的信息,我们将详细介绍react中this,并且为您提供关于9个javascript语法高亮插件 推荐_javascript技巧、act闲谈——全新webpack2、react-router4架构,喜欢折腾的别错过!、IE和Firefox之间在JavaScript语法上的差异_javascript技巧、Javascript Objects - Javascript语法基础 - Javascript核心的有价值信息。

本文目录一览:

react闲谈——JavaScript语法this全解(react中this)

react闲谈——JavaScript语法this全解(react中this)

先玩一个小游戏,你能回答下面的问题吗?

<script type="text/javascript">     
foo = "bar";      
function testThis() { 
      foo = "foo";    
 }     
 console.log(this.foo);  //第一个this.foo是什么?     
 testThis();    
 console.log(this.foo);  //第二个this.foo又是什么?
</script>

进入正题,如果你学过其他编程语言,你就知道this不只是JavaScript独有的东西。
在ES5的浏览器端中,根据作用域来分,有2种情况。

一、全局作用域下的this
this运行在函数之外,那么不管是不是严格模式,都是指向window。

this === window

二、函数作用域下的this
函数内部的this就比较复杂一点,因为存在多种情况,但是都有一个共同点,this取决于函数如何调用。也就是说,只有在函数被调用的时候,才存在this的指向
不理解可以看下面的各种情况解析,一共有9种情况。

1、函数直接调用的情况

非严格模式下,直接调用函数,内部的this将指向window。

t = 10 //定义一个全局变量t
function test(){
  return this.t;
}
console.log(test()) // 10

严格模式下,直接调用函数,内部的this将指向该函数运行时的环境。

function test(){
  "user strict" //严格模式
  return this;
}
console.log(test()) //undefined

这个例子中,虽然函数是在window下面直接运行的,但是他没有被调用,而是直接运行,所以this是undefined。
我们稍微改一下上面的代码,你就知道了什么叫做运行环境。

function test(){
  "user strict" //严格模式
  return this;
}
console.log(window.test()) //window

使用了window来调用函数,那么,函数的执行环境就是window,所以函数内部的this === window。当然,这已经不属于函数直接调用的情况了。
再写一个自执行函数的例子。

(function test(){
  //"use strict"; 严格模式下this指向undefined
  var t = 9;
  console.log(this) // window
})()

无论是自执行还是直接调用函数,都是一样的,他没有“被调用”,所以就没有上下文环境。那么为什么非严格模式下面,会指向window呢,是不是说明非严格模式下默认指向window.test()?没错,但严格模式下就没有默认的说法了,严格模式下也没法给自执行函数指定window是不。

2、对象中的this。

当用对象调用自己里面定义的方法时,this指向的这个对象。
例如:

var obj = {
  id: 9,test: function() {
    return this.id;
  }
};
console.log(obj.test()); //9

这个例子中,test()是对象obj里面的方法,通过obj调用test方法obj.test(),那么该函数的运行环境就是obj所在的上下文,所以this指向obj。
有人可能就会想,直接运行test()呢?你要是能在对象之外直接运行test(),我就服了你。

接着就是匿名函数的调用,this又指向什么?

var obj = {id: 9};
function test() {
  return this.prop;
}
obj.t = test;
console.log(obj.t()); // logs 9

仍然输出obj的id9,这说明this始终与执行环境有关,这里的执行环境就是obj。

3、原型链中的this(属于对象例子的衍生)
看官方提供的一个有趣的例子。

var o = {
  f : function(){ 
    return this.a + this.b; 
  }
};
var p = Object.create(o);
p.a = 1;
p.b = 4;
console.log(p.f()); // 5

首先定义一个对象o,对象里面有一个函数f,f里面有this,在对象o没有被调用的时候,f里面的this是没有意义的。
接着用create创建一个新的对象p继承了o的原型,那么p同时也就继承了o里面的函数f。
设置p.a = 1,p.b = 4,通过p.f()调用,则this的执行环境指向了对象p。
如果不创建原型,它是这样的。

var o = {
  f : function(){ 
    return this.a + this.b; 
  }
};
o.a = 1,o.b = 4
=>
var o = {
  a: 1,b: 4,f : function(){ 
    return this.a + this.b; 
  }
};
=>
o.f() // 5

4、getter与setter中的this(属于对象例子的衍生)
get和set可能很多人没有用过,get用来获取对象的属性,set用来设置对象的属性。

var obj = {
  a: 1,b: 2,get test(){
    return this.a + this.b;
  },set f(x) {
    this.a = x;
    this.b = x + 1;
  }
};
console.log(obj.test) //3
obj.f = 5
console.log(obj.test) //11

在上面的例子中,定义一个对象obj,有一个get,用来获取this.a + this.b的和,同理,单独一个对象中this是没有意义的,当obj调用它自身的test方法时obj.test,this就指向obj,因为obj是test的运行环境。
然后设置obj.f = 5,通过set设置obj的属性a和b的值为5和6,不再是1和2,之后再次调用obj.test,this仍旧指向obj。所以,无论你怎么调用对象内部函数中的this,它都是指向当前这个obj,因为obj是它的运行环境,上一个例子中的继承也是一个道理,只不过是通过继承对象的属性,使得运行环境在另外一个对象中。

5、构造函数中的this
如果你懂java或者C++,那么你一定知道“实例”这个概念,在JavaScript中,创建了一个构造函数,当我们使用new来实例化的时候,这个实例化的的对象就是一个运行环境,构造函数中的this就是指向实例化的对象。

function Templete(){
  this.a = 8;
}
var t = new Templete();
console.log(t.a); // 8

上面的例子中,有一个构造函数Templete,当new了一个新的对象t,那么this就指向了t,所以this.a == 8。

6、call和apply中的this
call和apply你如果熟悉的话,就会知道它的第一个参数是绑定函数的运行环境。

function add(x) {
  return this.a + x
}
var obj = {
  a: 10
}
var sum = add.call(obj,8)
//var sum = add.apply(obj,[8])
console.log(sum) // 18

上面的例子中,我们定义了一个函数add,用来求a+x的和,但是这个a是用this.a指代的,我们如果直接运行add(x),无法给a设置值,这个时候就得apply和call登场了。
我们首先需要知道this.a从哪里来,这里定义了一个对象obj,设置了一个属性a,我们通过apply和call把add函数里面的this绑定到了obj对象中。
所以add里面的this指向的是obj对象。

7、bind中的this
bind中的this和apply和call是一样的,它的第一个参数用来绑定this指向的对象,记住是一个对象。

function f(x){
  return this.a + x;
}
var obj = {
  a: 10
}
var sum = f.bind(obj,8);
console.log(sum()) // 18

还是第6种情况中的例子,只不过用bind来绑定当前函数的this指向obj,这里就不需要再重复解释一遍了。

8、DOM事件函数中的this
想必这个大家都比较了解了,我们监听一个DOM元素,给这个DOM元素绑定一个事件,那么事件函数中的this指向当前的DOM元素

var ele = document.getElementById('tab');
ele.addEventListener('click',func,false);
function func(e) {
    console.log(this === e.target) //true
}

这个例子中,给id叫做tab的元素绑定了click事件,事件名称叫做func,那么使得func()函数执行的环境是ele,所以func()函数中的this是指向ele元素。

9、内联事件中的this。
我们如果直接在dom元素上绑定一个事件,事件函数中的this直接指向的是它对应的dom元素,和第8种情况类似。

<div onclick="alert(this.tagName.toLowerCase())"></div>

打印出来是当前的div元素。

官方还举了一个特殊的例子,看下面。

<button onclick="alert((function(){return this})());">
  Show inner this
</button>

在这个特殊的例子中,alert里面是一个自执行函数,还记得我在第1种情况说的话吗?自执行函数没有被调用,所以严格模式下this是指向undefined的,而非严格模式下是指向window。

总结:这么多this的场景,其实它就一句话:this永远指向它执行的上下文环境。
无论是apply还是call还是bind,都只是为了给this指定一个上下文环境。

说了这么多ES5的this,记住,是浏览器端的,别拿服务端的this来说话。
关于ES6中的this,其实ES5中的构造函数和ES6中的class继承this的指向是一样的道理,其他的也一样,就不重复说了。

小试牛刀:学了这么多,累不累,不知道自己学懂没有,做题目测试一下吧。
题目1:

function Thing1() {}
Thing1.prototype.foo = "thing1";
Thing1.prototype.logFoo = function () {
    console.log(this.foo);
}

function Thing2() {
    this.foo = "thing2";
}
Thing2.prototype = new Thing1();

var thing = new Thing2();
thing.logFoo();

题目2:

function Thing() {}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {  
    console.log(this.foo);   
}

function doIt(method) {
    method();
}

var thing = new Thing();
thing.logFoo();
doIt(thing.logFoo);

题目3:

var obj = {
    foo: "bar",deeper: {
        logFoo: function () {
            console.log(this.foo);
        }
    }
};

obj.deeper.logFoo();

题目4:

<div></div>
<div></div>
<script type="text/javascript">

$(".foo").each(function () {
    console.log(this); 
});

$(".foo").each(function () {
    this.click();
});
</script>

如果你觉得有说的不对的地方,可以指出来,觉得说的好,收藏一下呗。

9个javascript语法高亮插件 推荐_javascript技巧

9个javascript语法高亮插件 推荐_javascript技巧

下面介绍的是一些纯javascript实现的语法高亮插件。

英文原文:http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/

1. SyntaxHighlighter
我相信这个插件是我们使用多的,它支持超多的语言,如果遇到不支持的语法还支持自定义。

2. SHJS
SHJS 是js语法高亮插件的代表,它支持很多编程语言,兼容Firefox 2 &3, IE 6 & 7, Opera 9.6, Safari 3.2 &Chrome 1.0。


3. beautyOfCode
beautyOfCode 是一个基于jQuery的语法高亮插件,使用了Alex Gorbatchev的语法高亮脚本使它更贴近 XHTML标准。


4. Chili
Chili is也是基于jQuery的语法高亮插件,支持很多语言并且带很多可配置项。

5. Lighter.js
Lighter.js是基于MooTools的免费语法高亮插件, 简单易用。

6. Highlight.js
highlight.js 同样是简单易用,支持多数语言,它有很多可以跟CMS、论坛和博客整合的插件。

7. DlHighlight
DlHighlight是一款比较简单的高亮插件,仅支持JavaScript, CSS, XML, HTML。

8. Google Code Prettify
Google Code Prettify是谷歌出品的语法高亮插件,可以高亮html页面中的部分代码片段。

9. JUSH
JUSH是另外一个 jQuery语法高亮插件 ,支持HTML, CSS, PHP, PY 和 SQL。

act闲谈——全新webpack2、react-router4架构,喜欢折腾的别错过!

act闲谈——全新webpack2、react-router4架构,喜欢折腾的别错过!

IE和Firefox之间在JavaScript语法上的差异_javascript技巧

IE和Firefox之间在JavaScript语法上的差异_javascript技巧

尽管 javascript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一些代码在用户机器上正常工作依然是必要的。

这篇文章中,我会略述一下 Internet Explorer 和 Firefox 在 JavaScript 语法上不同的 7 个方面。

1. CSS “float” 属性

获取给定对象的特定 CSS 属性的基本语法是 object.style 属性,而且有连字符的属性要用骆驼命名法来代替。例如,获取一个 ID 为 “header” 的 div 的 background-color 属性,我们要用如下语法:

复制代码 代码如下:
document.getElementById("header").style.borderBottom= "1px solid #ccc";

但是由于 “float” 是 JavaScript 的保留词,我们就无法使用 object.style.float 来获取 “float” 属性了。一下是我们在两种浏览器中的使用的方法:

立即学习“Java免费学习笔记(深入)”;

IE 语法: 

复制代码 代码如下:
document.getElementById("header").style.styleFloat = "left";

Firefox 语法: 

复制代码 代码如下:
document.getElementById("header").style.cssFloat = "left";

2. 元素的计算样式

通过使用上述的 object.style.property, JavaScript 可以很容易的获取和修改对象的设定 CSS 样式。但是这一语法的局限在于,它只能取得内联在 HTML 里的样式,或者直接使用 JavaScript 设定的样式。style 对象不能获取使用外部样式表设定的样式。为了获取对象的”计算样式”,我们使用以下代码:

IE 语法: 

1

2

var myObject = document.getElementById("header");

var myStyle = myObject.currentStyle.backgroundColor;

登录后复制

Firefox 语法:

1

2

3

var myObject = document.getElementById("header");

var myComputedStyle = document.defaultView.getComputedStyle(myObject, null);

var myStyle = myComputedStyle.backgroundColor;

登录后复制

3. 获取元素的”class”属性

类似于”float”属性的情况,这两种浏览器使用不同的 JavaScript 方法来获取这个属性。

IE 语法:

1

2

var myObject = document.getElementById("header");

var myAttribute = myObject.getAttribute("className");

登录后复制

Firefox 语法:

1

2

var myObject = document.getElementById("header");

var myAttribute = myObject.getAttribute("class");

登录后复制

4. 获取 label 标签的 “for” 属性

和 3 一样,使用 JavaScript获取 label 的 “for” 属性也有不同语法。

IE 语法:

1

2

var myObject = document.getElementById("myLabel");

var myAttribute = myObject.getAttribute("htmlFor");

登录后复制

Firefox 语法:

1

2

var myObject = document.getElementById("myLabel");

var myAttribute = myObject.getAttribute("for");

登录后复制

对于 setAtrribute 方法来说也是同样的语法。

5. 获取光标位置

获取元素的光标位置比较少见,如果需要这么做,IE 和 Firefox 的语法也是不同的。这个示例代码是相当基础的,一般用作许多复杂事件处理的一部分,这里仅用来描述差异。需要注意的是,IE 中的结果和 Firefox 中是不同的,因此这个方法有些问题。通常,这个差异可以通过获取 “滚动位置” 来补偿 - 但那是另外一篇文章的课题了。

IE 语法:

1

2

3

var myCursorPosition = [0, 0];

myCursorPosition[0] = event.clientX;

myCursorPosition[1] = event.clientY;

登录后复制

Firefox 语法:

1

2

3

var myCursorPosition = [0, 0];

myCursorPosition[0] = event.pageX;

myCursorPosition[1] = event.pageY;

登录后复制

6. 获取视窗或浏览器窗口的尺寸

有时需要找出浏览器的有效窗口空间的尺寸,一般成为”视窗”。

IE 语法:

1

2

3

var myBrowserSize = [0, 0];

myBrowserSize[0] = document.documentElement.clientWidth;

myBrowserSize[1] = document.documentElement.clientHeight;

登录后复制

Firefox 语法:

1

2

3

var myBrowserSize = [0, 0];

myBrowserSize[0] = window.innerWidth;

myBrowserSize[1] = window.innerHeight;

登录后复制

7. Alpha 透明

嗯,这其实不是 JavaScript 的语法项目 - alpha 透明是通过 CSS 来设置的。但是当对象通过 JavaScript 设置为淡入淡出时,这就需要通过获取 CSS 的 alpha 设定来实现,一般是在循环内部。要通过以下 JavaScript 来改变 CSS 代码:

IE 语法:

1

2

3

#myElement {

filter: alpha(opacity=50);

}

登录后复制

Firefox 语法:

1

2

3

#myElement {

opacity: 0.5;

}

登录后复制

要使用 JavaScript 获取这些值,需要使用 style 对象:

IE 语法:

1

2

var myObject = document.getElementById("myElement");

myObject.style.filter = "alpha(opacity=80)";

登录后复制

Firefox 语法:

1

2

var myObject = document.getElementById("myElement");

myObject.style.opacity = "0.5";

登录后复制

当然,已经说到了,一般是在循环中间来改变 opcity/alpha,来创建动画效果,但这这是个简单的例子,只是为了明白地描述方法是如何实现地。

7个方面在JavaScript语法上不同的点,希望对大家的学习有所帮助。

Javascript Objects - Javascript语法基础 - Javascript核心

Javascript Objects - Javascript语法基础 - Javascript核心

原文: http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Objects.html

源代码: https://github.com/RobinQu/Programing-In-JavaScript/blob/master/chapters/JavaScript_Core/Javascript_Basics/Objects.md

Javascript Objects

创建对象

类继承

Javascript对象拥有自有属性和继承属性。

可以使用in 或者 hasOwnProperty 来判断对象中是否存在属性。

对象属性

可以使用 for..in 来遍历对象的属性

使用for..in时会遍历到原型链上的属性。遍历顺序是以广度优先遍历

所以使用hasOwnProperty便可以判断是否是对象自有的属性。

使用Object.getOwnPropertyDescriptor()获取对象特定属性的描述符

可写性(writable) 表示对象属性是否可写

例如

var o = {
    foo : ''bar''
}

Object.defineProperty(o, "foo", { writable : false });

o.foo = ''world'';
console.log(o.foo);//仍然输出bar

可枚举性(enumerable) 表示对象属性是否可枚举

例如
Array中的length等属性的 enumerable是false,所以,

for (p in Array) {
    console.log(p);
}

什么也不输出

可配置性(configurable) 表示可否修改属性的可配置性和可枚举性

可以用Object.defineProperties来定义这些配置属性。

Object.defineProperty(o, "foo", { writable : false });

Get 表示获取对象属性的方法
Set 表示设置对象属性的方法

示例

var book = {
    _year: 2004,
    edition: 1
};
Object.defineProperty(book, "year", {
    get: function () {
        console.log(''get year'');
        return this._year;
    },
    set: function (newValue) {
        console.log(''set year'');
        if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});
book.year = 2005;//控制台输出‘set year’
console.log(book.year);//控制台输出‘get year’和year的值

对象方法

可执行对象

通过如下方法可以创建一个可执行对象

function bar(o) {
    var f = function() { return "Hello World!"; }
    o.__proto__ = f.__proto__;
    f.__proto__ = o;
    return f;
}

var o = { x: 5 };
var foo = bar(o);

console.log(foo());
console.log(foo.x);
console.log(typeof foo);//function

既可以当作对象来使用(有原型链),也可以当作函数来直接调用

今天关于react闲谈——JavaScript语法this全解react中this的介绍到此结束,谢谢您的阅读,有关9个javascript语法高亮插件 推荐_javascript技巧、act闲谈——全新webpack2、react-router4架构,喜欢折腾的别错过!、IE和Firefox之间在JavaScript语法上的差异_javascript技巧、Javascript Objects - Javascript语法基础 - Javascript核心等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇react native navigator 的使用(react native 应用)

下一篇TabBar切换页的实现——React-native-tab-navigator的使用(tab页面切换)