使用类/构造函数与变量方法时的作用域不同
different scope when using class/constructor vs. variable methods
我有一个脚本,用于解析关键字的特定对象属性,然后将这些关键字和另一个属性附加到对象。新的属性值将打印到文档中以进行错误检查。
var chemistry = {
field: "chemistry",
keywords: [
"atom",
"proton",
"electron",
"wavefunction",
"neutron",
"catalyst"],
filter: function( title ) {
var i;
for( i = 0 ; i < title.split( " " ).length; i++ ) {
var title_part = title.toLowerCase().split( " " )[ i ];
var j;
for( j = 0 ; j < this.keywords.length; j++ ) {
if ( this.keywords[ j ] == title_part && library[ 0 ].keywords.indexOf( this.keywords[ j ] ) == -1 ) {
library[ 0 ].keywords.push( this.keywords[ j ] );
if ( library[ 0 ].field.indexOf( this.field ) == -1 ) {
library[ 0 ].field.push( this.field );
};
};
};
};
}
};
chemistry.filter( library[0].title );
document.writeln( "KEYWORDS: " + library[0].keywords );
document.writeln( "FIELD: " + library[0].field );
这工作正常,但我正在尝试创建一个类来构造一个新对象,如上所述。这是我正在使用的代码
"use strict"
class Discipline {
constructor(field, keyword) {
this.field = field;
this.keywords = keyword;
this.filter = function( title ) {
var i;
for( i = 0 ; i < title.split( " " ).length; i++ ) {
var title_part = title.toLowerCase().split( " " )[ i ];
var j;
for( j = 0 ; j < this.keywords.length; j++ ) {
if ( this.keywords[ j ] == title_part && library[ 0 ].keywords.indexOf( this.keywords[ j ] ) == -1 ) {
library[ 0 ].keywords.push( this.keywords[ j ] );
if ( library[ 0 ].field.indexOf( this.field ) == -1 ) {
library[ 0 ].field.push( this.field );
};
};
};
};
}
}
};
var chemistry = new Discipline("chemistry", "electron");
chemistry.filter( library[0].title );
document.writeln( "KEYWORDS: " + library[0].keywords );
document.writeln( "FIELD: " + library[0].field );
过滤器似乎没有输出任何内容,我只在文档中看到"关键字:字段:"。令人困惑的是,如果我使用 document.writeln() 检查 library[0].field 和 library[0].关键字,我会得到预期的值。
我想知道当我使用类构造函数时,"this."的范围是否会改变。还是发生了其他事情?
顺便说一句,如果有人知道将数组作为关键字参数传递的好方法,那将不胜感激。现在我正在传递一个间隔的字符串并拆分它。
是的,this
的范围正在发生变化。不过,您可以执行以下操作:
var that = this;
然后在需要的地方使用that.keywords
。所以在你的代码中,像这样:
class Discipline {
constructor(field, keyword) {
var that = this;
that.field = field;
that.keywords = keyword;
that.filter = function( title ) {
var i;
for( i = 0 ; i < title.split( " " ).length; i++ ) {
var title_part = title.toLowerCase().split( " " )[ i ];
var j;
for( j = 0 ; j < that.keywords.length; j++ ) {
if ( that.keywords[ j ] == title_part && library[ 0 ].keywords.indexOf( this.keywords[ j ] ) == -1 ) {
library[ 0 ].keywords.push( that.keywords[ j ] );
if ( library[ 0 ].field.indexOf( that.field ) == -1 ) {
library[ 0 ].field.push( that.field );
};
};
};
};
}
}
};
相关文章:
- 在put方法之前从作用域获取数据
- Visual Studio展开方法和所有子作用域或仅折叠方法
- 为什么't我的角度控制器'在其某个方法内的作用域中的依赖项
- 直接在DOM事件处理程序中调用作用域函数的最短方法是什么
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- 在对象类上实现 jquery 作用域的最佳方法
- 从多个控制器上的指令访问作用域的正确方法
- 有没有办法迭代函数作用域内的公共方法
- 使用类/构造函数与变量方法时的作用域不同
- JavaScript 中的范围(为什么在 $.post() 方法数组的作用域是本地的?)
- 描述从回调方法获取正确的作用域
- 作用域问题反应父子方法ES6
- JavaScript——如何将作用域传递给reader.onload方法
- 数组排序方法内部的作用域
- 作用域或控制器上的Angular js difference方法
- 在全局作用域上调用Object.prototype方法
- 使用 JSON 对 js 对象进行分级/解析时,返回的方法中的函数作用域会丢失
- 用JavaScript编写块作用域的最短方法是什么
- 全局作用域映射的Javascript方法
- 将作用域变量传递给作用域方法