Это также сработало, если я переместил все логические условия за пределы конвейера, и переменные стали глобальными на всех этапах
def user_id = currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
def full_name = currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserName()
DevWorkspace_name = "${Developer_workspace}"
if ( DevWorkspace_name ==~ /(?s).*Allura_Main_Infra_PreInt.*/) {
loadrule = "Infra-uInfra/Infra.loadrule"
subsystem = "Infra"
stream_name = "Allura_Main_Infra_PreInt"
}
pipeline {
.....
}
Что Вы делаете, здесь действительно не обходит опытную цепочку - этот вопрос мог бы помочь Вам понять то, что на самом деле продолжается. Я не потрудился проверять спецификацию ECMA, но здесь являюсь своим взятием по проблеме:
Функция является конструктором функциональных объектов
Function.prototype является прототипом, которому наследовались все функциональные объекты - он мог бы содержать свойства как вызов и применяться, которые характерны для всех Функциональных экземпляров; внедрения, которые Вы проверили, были согласованны в этом, это реализовано как сам функциональный объект (как некоторые указали, спецификация ECMA требует этого),
Function.prototype.prototype действительно не имеет большого смысла, но поскольку Function.prototype реализован как функциональный объект (который мог возможно использоваться в качестве конструктора), он должен, по крайней мере, существовать; объекты, которые создаются с помощью Function.prototype в качестве конструктора, наследовали бы его свойства - но поскольку не должно быть никакой причины сделать, что-то безумное как это, устанавливая его в NULL, неопределенный или пустой объект разумно
Function.prototype.prototype.prototype будет во всей вероятности быть неопределенным: как мы видели прежде, Function.prototype.prototype должен быть чем-то без свойств (пустой, неопределенный или пустой объект) и определенно не функциональный объект; поэтому, его опытное свойство должно быть не определено или могло бы даже бросить ошибку при попытке быть полученным доступ
Надежда это помогает ;)
Function.prototype
Из спецификации языка ECMAScript:
15.3.3.1 Function.prototype
Начальное значение Function.prototype является объектом Прототипа функции (разделите 15.3.4).
15.3.4 Свойства объекта прототипа функции
Объектом Прототипа функции является самостоятельно Функциональный объект ([[Класс]], "Функция"), что при вызове принимает любые аргументы и неопределенные возвраты. Значение внутреннего свойства [[Prototype]] объекта Прототипа функции является Объектным объектом прототипа (разделите 15.3.2.1).
Это - функция с “пустым телом”; если это вызывается, это просто возвращается неопределенный. Объект Прототипа функции не имеет valueOf собственного свойства; однако, это наследовало valueOf свойство от Объектного объекта прототипа.
Я получаю этот вывод:
Chrome и IE7 назвали их функции, Opera и IE7 говорят Вам, что она не покажет реализацию. Они все договариваются об этом:
nl(typeof Function.prototype); //function
Сравните это с:
nl(typeof Object.prototype); //object
nl(typeof Array.prototype); //object
nl(typeof String.prototype); // object
Function.prototype.prototype
Я становлюсь неопределенным от Opera и IE7, пустого указателя от Chrome и [объектный Объект] от FF3. Кто прав? Начиная с "Объектом Прототипа функции является самостоятельно Функциональный объект", разве это не должна быть циклическая ссылка на себя? Для предотвращения циклической ссылки, они выбрали различные пути. Я не знаю, существует ли стандарт для этого или если это до реализации, но я думаю, что Объект является правильным. Btw, здесь Вы видите различие между внутренним [[прототип]] и общедоступным прототипом в действии, как Вы спрошенный в более раннем вопросе!
Function.prototype.prototype == Object.prototype
Это - ложь, потому что это не тот же объект. Посмотрите выше.
Function.prototype.prototype.prototype
Только FF даст Вам, ответ из-за их реализации Function.prototype.prototype возвращает Объект.
Я соглашаюсь, что Ваш предложенный вывод смотрит больше логики.
Они действительно договариваются об этом:
nl(Object.prototype); // [object Object]
nl(Object.prototype.prototype); // undefined
Отвечать на Ваш вопрос непосредственно: Mozilla является правильным. Не только потому, что Brendan Eich работает на Mozilla, но потому что это - единственный правильный способ сделать это. Давайте пробежимся через детали:
prototype
свойство, которое будет использоваться для построения объектов.Object
ни Object.prototype
.Позвольте мне уточнить последний оператор. Если это - ложь, мы можем воссоздать функцию в пользовательском коде как этот:
// we re-creating the function!
// our function constructor
var Fun = function(){ /*...*/ };
// let's chain the prototype
Fun.prototype = new Object();
// do we have a function now? let's fund out
var fun = new Fun();
console.log(fun.length); // undefined
fun.call(null); // fail
fun.apply({}, [1, 2, 3]); // fail
// nope
Мы можем наблюдать это new Object()
не определяет новые методы, ни свойства и может попытаться использовать Object.prototype
непосредственно с тем же результатом.
Сводка: прототип функции не Object
ни Object.prototype
. Это - некоторый совершенно особый объект. Это - еще одна причина, почему мы не можем воссоздать функцию в пользовательском коде.
Править: поскольку больше деталей о прототипах смотрит на этот ответ.
Я знаю, что этот пост является своего рода старым, но я искал чистую информацию об этой теме и решил опубликовать то, что я нашел. Свойство прототипа предназначена для конструктора. Это позволяет назначить объект прототипа объектов, которые вы создадите с новым ключевым словом.
Каждый объект в JavaScript имеет объект прототипа, но многие реализации не дают вам прямой доступ к нему или позволит вам установить его после создания объекта. В Firefox вы можете получить доступ к этому объекту через свойство « __
__
.
Ниже у меня есть версия вашего кода с использованием свойства « __
__
. Раздел на функциональной цепочке прототипов соответствует тому, что вы думали, что это должно быть.
function nl(z) { document.write(z + "<br>"); }
x = {};
nl(x["__proto__"]);
nl(x["__proto__"] === Object.prototype);
nl("");
nl(nl.prototype.constructor);
nl(nl["__proto__"].constructor);
nl(nl["__proto__"] === nl.prototype);
nl("");
nl(nl["__proto__"]);
nl(nl["__proto__"] === Function.prototype);
nl(nl["__proto__"]["__proto__"] === Object.prototype);
nl(nl["__proto__"]["__proto__"]["__proto__"]);
nl("");
nl(Function["__proto__"]);
nl(Function["__proto__"]["__proto__"]);
nl(Function["__proto__"]["__proto__"] === Object.prototype);
nl(Function["__proto__"]["__proto__"]["__proto__"]);
Выход в Firefox:
[object Object]
true
function nl(z) { document.write(z + "
"); }
function Function() { [native code] }
false
function () { }
true
true
null
function () { }
[object Object]
true
null