Вы можете создать такую обертку, как это:
function get_something(name in varchar2,
ignore_notfound in varchar2) return varchar2
is
begin
return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;
, а затем вызывать:
select get_something('NAME', 'TRUE') from dual;
Вам решать, какие допустимые значения ignore_notfound находятся в вашей версии, Я предположил, что TRUE означает TRUE, а что-то еще означает FALSE.
Я запустил это сообщение с единственной цели изучить, почему это, которое вещи произошли, и я наконец, сделало. Таким образом в случае, если существует кто-то еще заинтересованный "whys" здесь, они:
, Почему, 'это' изменяется в анонимной функции?
А новая функция, даже если это - анонимное, объявленный в объекте или другой функции ВСЕГДА, ИЗМЕНЯЕТ ОБЪЕМ в этом случае, возвращающемся к глобальной области видимости (окно)
Решение: все указанные в сообщении, я думаю, что более ясное выполняет анонимную функцию с .call (это)
, Почему getname () всегда возвращает возраст?
, В то время как анонимная функция выполняется сразу же, методы get/методы set выполняются впервые, когда их называют. В тот момент значение [1 114] я всегда буду последним, потому что оно уже выполнило итерации для всех свойств... и будет всегда возвращать свойства [я], который является последним значением, в этом случае возраст.
Решение: сохраняют значение меня в переменной как это
for ( i in properties ) { (function(){
var j = i
//from now on use properties[j]
, Это - в основном оно, если я неправ в чем-нибудь, что я сказал, исправьте меня, так как я пытаюсь изучить это...
Еще раз спасибо.
РЕДАКТИРОВАНИЕ: теперь, адаптируя ответ Jason, это работает:
Мы должны сделать закрытие для значений. Вот один путь:
function bindAccessors(o, property, value) {
var _value = value;
o["get" + property] = function() {
return _value;
};
o["set" + property] = function(v) {
_value = v;
};
}
Тогда Пользовательский конструктор похож на это:
function User( properties ) {
for (var i in properties ) {
bindAccessors(this, i, properties[i]);
}
}
я думаю, что лучше не использовать new
ключевое слово вообще при работе в JavaScript.
Это вызвано тем, что, если Вы тогда инстанцируете объекта без [1 123] использование нового ключевого слова (исключая: var user = User()
) по ошибке, *очень плохие вещи произойдут...*reason будучи этим в функции (если инстанцировано без new
ключевое слово), эти this
будет относиться к глобальный объект , т.е. window
...
Поэтому, я предлагаю лучший путь о том, как использовать подобные классу объекты.
Рассматривают следующий пример:
var user = function (props) {
var pObject = {};
for (p in props) {
(function (pc) {
pObject['set' + pc] = function (v) {
props[pc] = v;
return pObject;
}
pObject['get' + pc] = function () {
return props[pc];
}
})(p);
}
return pObject;
}
В вышеупомянутом примере, я создаю новый объект в функции, и затем присоединяю методов get и методы set к этому недавно созданному объекту.
Наконец, я возвращаю этот недавно созданный объект. Примечание, что this
ключевое слово не используется нигде
Затем для 'инстанцирования' user
, я сделал бы следующее:
var john = user({name : 'Andreas', age : 21});
john.getname(); //returns 'Andreas'
john.setage(19).getage(); //returns 19
лучший способ постараться не попадать в ловушки, не создавая их во-первых ... В вышеупомянутом примере я избегаю new
ловушка ключевого слова (, как я сказал, не используя new
ключевое слово, когда это, как предполагается, используется, вызовет плохие вещи произойти ) [1 126] не использование new
вообще.
Вы, вероятно, хотите что-то вроде этого, которое более читаемо: (закрытия легко изучить, как только Вы получаете некоторую практику)
function User( properties ) {
// helper function to create closures based on passed-in arguments:
var bindGetterSetter = function(obj,p,properties)
{
obj["get"+p]=function() { return properties[p]; }
obj["set"+p]=function(val) { properties[p]=val; return this; }
};
for (var p in properties)
bindGetterSetter(this, p, properties);
}
, я также добавил, "возвращают это"; таким образом, можно сделать:
u=new User({a: 1, b:77, c:48});
u.seta(3).setb(20).setc(400)
Как записано в OP, this
в цикле не называет Пользовательский объект, как это должно быть. При получении той переменной вне цикла можно заставить его работать:
function User( properties ) {
// Iterate through the properties of the object, and make sure
// that it's properly scoped (as discussed previously)
var me = this;
for ( i in properties ) { (function(){
// Create a new getter for the property
me[ "get" + i ] = function() {
return properties[i];
};
// Create a new setter for the property
me[ "set" + i ] = function(val) {
properties[i] = val;
};
// etc
Возможно, переменная я "закрываюсь" с последним значением в повторении ("возраст")? Тогда все методы get и методы set получат доступ к свойствам ["возраст"].
Я нашел что-то, что, кажется, ответ, все о контексте. Используя анонимную функцию в для, изменяет контекст, заставляющий 'это' относиться к объекту окна, странному не так ли?
так:
function User( properties ) {
for ( var i in properties ) {
// here this == User Object
(function(){
// inside this anonymous function this == window object
this[ "get" + i ] = function() {
return properties[i];
};
this[ "set" + i ] = function(val) {
properties[i] = val;
};
})();
}
}
я не знаю, почему та функция изменяет контекст выполнения, я не уверен, что это должно сделать это, так или иначе можно протестировать его выполняющий код там и пробующий window.getname (), и это волшебно работает!: S
решение как пресыщенное прежде изменяет контекст, оно может быть сделано как Cooper J, сказал, передав переменную 'меня' и делая функцию закрытием, или можно сделать это:
(function(){
// inside this anonymous function this == User because we called it with 'call'
this[ "get" + i ] = function() {
return properties[i];
};
this[ "set" + i ] = function(val) {
properties[i] = val;
};
}).call(this);
Так или иначе, я все еще добираюсь 44 при выполнении 'getname'... какие-либо идеи?