Здесь является одним из хороших источников this
в JavaScript
.
Вот сводка:
this
является объектом window
Если вы используете use strict;
, в котором case this
будет undefined
Если вы вызываете функцию с new
, this
будет новым контекстом, он не будет ссылаться на глобальный this
.
Функции, которые вы создаете, становятся объектами функции. Они автоматически получают специальное свойство prototype
, которое вы можете присвоить значениям. Когда вы создаете экземпляр, вызывая функцию с помощью new
, вы получаете доступ к значениям, присвоенным свойству prototype
. Вы получаете доступ к этим значениям с помощью this
.
function Thing() {
console.log(this.foo);
}
Thing.prototype.foo = "bar";
var thing = new Thing(); //logs "bar"
console.log(thing.foo); //logs "bar"
Обычно ошибка заключается в назначении массивов или объектов на prototype
. Если вы хотите, чтобы экземпляры каждого имели свои собственные массивы, создайте их в функции, а не в прототипе.
function Thing() {
this.things = [];
}
var thing1 = new Thing();
var thing2 = new Thing();
thing1.things.push("foo");
console.log(thing1.things); //logs ["foo"]
console.log(thing2.things); //logs []
Вы можете использовать this
в любой функции объекта ссылаться на другие свойства этого объекта. Это не то же самое, что и экземпляр, созданный с помощью new
.
var obj = {
foo: "bar",
logFoo: function () {
console.log(this.foo);
}
};
obj.logFoo(); //logs "bar"
В обработчике событий HTML DOM this
всегда ссылается на элемент DOM, событие было присоединено к
function Listener() {
document.getElementById("foo").addEventListener("click",
this.handleClick);
}
Listener.prototype.handleClick = function (event) {
console.log(this); //logs ""
}
var listener = new Listener();
document.getElementById("foo").click();
Если вы не bind
контекст
function Listener() {
document.getElementById("foo").addEventListener("click",
this.handleClick.bind(this));
}
Listener.prototype.handleClick = function (event) {
console.log(this); //logs Listener {handleClick: function}
}
var listener = new Listener();
document.getElementById("foo").click();
Внутри атрибутов HTML, в которые вы можете поместить JavaScript, this
является ссылкой на элемент.
Вы можете использовать eval
для доступа к this
.
function Thing () {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
eval("console.log(this.foo)"); //logs "bar"
}
var thing = new Thing();
thing.logFoo();
Вы можете использовать with
, чтобы добавить this
в текущую область действия, чтобы читать и записывать значения на this
, явно не ссылаясь на this
.
function Thing () {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
with (this) {
console.log(foo);
foo = "foo";
}
}
var thing = new Thing();
thing.logFoo(); // logs "bar"
console.log(thing.foo); // logs "foo"
jQuery во многих местах имеет this
ссылается на элемент DOM.
Метод 1 будет работать, если вы сделали это правильно. lsearch
возвращает один результат по умолчанию, а критерии поиска принимают шаблон шара. Использование .
будет искать только элемент, равный .
. Затем вам понадобится цикл для lreplace
:
set idx [lsearch -all $list1 "*.*"]
foreach id [lsort -decreasing $idx] {
set list1 [lreplace $list1 $id $id]
}
Сортировка в порядке убывания важна, потому что индекс элементов будет меняться при удалении элементов (также обратите внимание, что вы использовали неправильное имя переменной в ваших фрагментах кода.
Метод 2 также будет работать, если вы использовали правильное регулярное выражение:
set b [regsub -all -line {.*\..*} $list1 ""]
Но в этом случае вы, вероятно, захотите обрезать результаты. .*
будет соответствовать любым символам, кроме новой строки.
Я бы использовал, например, lsearch
, что позволяет избежать необходимости замены:
set mylist [lsearch -all -inline -not $list1 "*.*"]
] В качестве альтернативы, отфильтруйте список для непринятых элементов, используя lmap
(или явный цикл, используя foreach
):
lmap el $list1 {if {[string first . $el] >= 0} {continue} else {set el}}
См. также соответствующее обсуждение фильтрующих списков, например lmap` для фильтрации списка строк
Команда lsearch имеет множество опций, некоторые из которых могут помочь сделать эту задачу довольно простой:
lsearch -all -inline -not $list1 *.*